== Changelog ==

Full version history for Hack The SEO. The readme.txt carries the most recent releases; this file is the complete record, back to 1.0.0.

= 1.1.16 =
* Security: hardened the Markdown version of your pages. Updating is recommended.
* Changed: paginated archive pages (/page/2/, /page/3/ and so on) now declare their own canonical URL instead of pointing to the first page, and are no longer set to noindex by default, as Google recommends: they are the pages that lead to your older posts and products. If your site still had the plugin's default, it is updated once; a choice you made yourself in the Robots settings stays as it is.

= 1.1.15 =
* Added: "Explore with AI" buttons that open your post in ChatGPT, Claude, Perplexity, Google AI Mode or Le Chat, with a ready-made request to summarise it and cite your site. Add the "Explore with AI" block or the [htsfree_ai_explore] shortcode, or show them on every post from the SEO settings. Nothing appears until you choose to. The buttons use your theme's font and colours, adapt to mobile and dark themes, and stay out of your Markdown pages and feeds. An optional "Generated by Hack The SEO" line is off by default.
* Added: a "Business identity" card in the SEO settings (legal name, other brand names, SIREN or SIRET, VAT number, founding year, tagline, Wikidata page, founders, areas of expertise). It feeds your Organization structured data and the "About" section of your llms.txt. A French SIREN adds a link to your official record on annuaire-entreprises.data.gouv.fr, and an area of expertise can point to its Wikipedia page ("SEO | https://...").
* Fix: your X account was output without its "@", so X linked the card to no account. It is now always "@account", and a profile address (x.com/account) is accepted.
* Fix: a post whose structured data type is BlogPosting or NewsArticle published two unconnected descriptions of the same page. There is now one. Tutorials whose headings start with "Étape 1" are recognised, and their steps no longer carry raw line breaks, tabs, words cut in half or "[&hellip;]". The post author keeps the same identity from one page to the next.
* Changed: the link to each page's Markdown version is now also in the page's HTML head, not only in the HTTP headers.

= 1.1.14 =
* Fix: the generated robots.txt blocked /wp-includes/ and /wp-content/plugins/, which is where jQuery and the CSS and JavaScript of your plugins and page builder live. Google then renders your pages without their styles or scripts. Both rules are gone, and your existing robots.txt is cleaned once, on the first page load after the update, if those two lines are still exactly as the plugin wrote them.
* Fix: the generated robots.txt had blank lines in the middle of its rules. Some crawlers stop reading a group at the first blank line: measured with Python's standard robots.txt reader, only the /wp-admin/ rule was applied, and your search results and feeds were open to crawling. The rules now sit in one unbroken group, and the robots.txt editor warns you if you add a blank line inside a group.
* Changed: the robots.txt now names the AI crawlers it allows (GPTBot, ClaudeBot, PerplexityBot and others) in the main group. They get exactly the rights they had before, since they were already allowed, and follow the same rules as every other crawler. AI visibility audit tools reading your file now see plainly that you welcome them. A robots.txt you edited yourself, for instance with a group of your own, is not reorganised.
* Changed: llms.txt now links to the Markdown version of your pages and posts (for example /contact.md), which the plugin already serves for AI tools. Each Markdown page points search engines to the normal page with a canonical header, so the normal page remains the one indexed and cited.
* Added: llms.txt now introduces your business in an "About" section (founding date, tagline, expertise, address, phone, email, social profiles), taken from your Organization structured data settings, and lists your privacy policy and legal notice in a "Legal" section when those pages are indexable. Only the fields you filled in appear.
* Fix: llms.txt no longer links to your RSS feed, which the generated robots.txt disallows, and it announces the sitemap your site actually serves (Yoast's or Rank Math's when active). Page descriptions no longer glue the words of two neighbouring blocks together, and your home page no longer gets a list of post titles as its description: it takes your site tagline. The file now carries a Last-Modified date.

= 1.1.13 =
* Fix: the generated robots.txt offered "Claude-Web" and "anthropic-ai" as the Anthropic crawlers to block. Neither name appears in Anthropic's crawler documentation, which lists ClaudeBot, Claude-User and Claude-SearchBot, so uncommenting those lines blocked nothing on Anthropic's side. The list also missed Meta and Amazon. It now offers the names in use at OpenAI, Anthropic, Perplexity, Google, Apple, Meta, Amazon, ByteDance and Common Crawl.
* Your existing robots.txt is upgraded once, on the first page load after the update. Only the commented list is replaced; every other line stays exactly as it was. If you had already uncommented some of those lines, your file is left alone: a rule you switched on is yours to review. Nothing is blocked by default, before or after.

= 1.1.12 =
* Changed: the guide offer now appears on the dashboard from day one, instead of waiting a week. It showed up straight away on the AI crawlers screen only, so anyone who never opened that screen saw nothing for seven days. Every other screen is unchanged, and so is every way of saying no: "Not now" still silences it for fifteen days, "Do not show this again" still ends it for good, and it still steps aside when the review request is due.

= 1.1.11 =
* Changed: the milestone card now looks like the rest of the plugin. It used the amber of a warning, which made a piece of good news read like a problem. Same violet as everything else, and half the words: the sentences said in three lines what the screen underneath already shows.

= 1.1.10 =
* Fix: saying "Not now" to the guide offer now silences it on the AI crawlers screen too, for the same fifteen days it already applied everywhere else. It used to quiet only the floating card, so the offer sitting inside that screen came back on every single visit: a refusal counted for one surface out of two, and nothing told you so.
* Fix: the "How to check right now" box gave you a curl command pointing at your home page. On a default WordPress install the home page lists your posts, and detection only runs on a single post or page, so the command recorded nothing: you followed the instruction on the first screen after activation and concluded the module was broken. It now points at your most recent published content.

= 1.1.9 =
* Added: the AI connection screen now says what the connection is for before asking you to create a key. It opened on "Step 1, create your key", which is a set of instructions for something it had never named. Three tiles now answer it in a line each: ask a question about your own site instead of hunting for the answer, get your own figures rather than general advice, and nothing can be changed because every tool on the connection is read-only.
* Added: the same screen now walks you through it, tool by tool. Pick yours from Claude Code, Claude Desktop, Cursor, Windsurf and ChatGPT, and you get its line, three numbered steps and how to tell it worked. Before, every tool's instructions were stacked on the same page and you read the other four before finding yours.
* Fix: the screen said ChatGPT could not use this connection. That was wrong. The ChatGPT desktop app does accept a key carried in a header, in its own configuration file, and it now has its own block and its own steps like every other tool. What is true, and the screen now says so on the first step, is that this does not work on chatgpt.com in a browser.
* Changed: the Claude Code line now registers your site for your whole account rather than for the single folder the command was typed in. Run from anywhere else, the old line left Claude Code answering that no server was configured, with nothing to explain why.
* Changed: the guide is now offered on the AI crawlers screen itself, under the figures, from the day you install the plugin. The floating card that carried the offer waits a week before it appears, so on a fresh install the only place it showed up was the first-steps list, which is not where the question comes up. The card keeps every other screen; it simply stops competing with the offer now sitting inside this one.
* Changed: once you have asked for the guide, or said you do not want it, the offer disappears everywhere, the first-steps list included. That step used to stay struck through for good. A completed setup step is worth showing; an offer already taken up is just a line that never goes away.
* Fix: two pages with nothing in common were reported as competing for the same keyword. WordPress stores a curly apostrophe, a dash or French quotation marks as a code rather than as the character itself, and the comparison was reading those codes as if they were words. Two French pages both containing an accent and a pair of quotation marks therefore shared three invented words, which was enough to pair them. Worse, an accented word was cut in two and vanished from the comparison entirely. Pairs already recorded this way are removed once, on update, unless you had already decided something about them, in which case your decision is kept.
* Added: the AI crawler figures are now split by what each robot came for. A robot collecting text to train a model, a robot feeding a search index, and a robot fetching the page right now to answer somebody's question are three different things, and only the last can put you in an answer a visitor reads. Measured on two unrelated sites, the purposes that answer nobody accounted for about nine tenths of the total, so a single total invited the conclusion that your AI visibility was ten times what it is. The total is unchanged and still there; the split sits beside it, and hits from a robot we cannot identify are counted separately instead of being spread across the three.
* Added: the first-steps card now has a step for the guide. Its button opens the form in a dialog box rather than sending you to another screen, and a grey "Mark as done" next to it puts the step away for anyone who is not interested. The step disappears entirely for anyone who has asked not to be offered the guide again.
* Changed: both cards now use the full width of the screen, like every other notice in the admin. They were capped at 760 pixels and floated in the middle of a wide screen. The text itself is still capped, at around 65 characters a line, because that is what makes it readable.
* Changed: the "Leave a review" button keeps its white, bold label whatever the rest of the admin does to links.

= 1.1.8 =
* Fix: two different cards could ask you for something on the same screen. The card offering the guide and the one asking for a review used the same rule about where to appear, with nothing deciding between them, so the day you crossed a milestone both turned up one under the other. Two requests stacked are not two chances, they are two refusals. Only one appears now, and the review goes first: it only fires on a milestone you actually reached, once, and it goes stale, while the other card has every other page to itself.
* Changed: the card offering the guide now starts on the AI crawlers screen. That screen shows you what GPTBot and ClaudeBot did on your site, and the guide answers the question that screen just raised; anywhere else it interrupts something unrelated. If you do not go there, it appears everywhere after three plugin screens, so nothing is lost by not visiting it.
* Changed: both cards were redrawn. The guide carries a white-paper cover and the indigo the plugin uses everywhere it talks about AI visibility; the review request carries the amber of its own stars. They no longer look like a WordPress error message, and you can tell which is which before reading either.
* Changed: the guide card's send button no longer looks broken while it waits. It stays dimmed until you tick the consent box, then lights up, instead of sitting there greyed out with nothing saying why.
* Fix: the review card's button showed blue text on a blue background on some setups, because a link rule from the admin overrode the button's own colour. Its label is white in every state now.

= 1.1.7 =
* Fix: the author profile screen was written in English and could not be translated. Eleven field labels, from "Job Title" to "GitHub URL", were fixed in the code rather than passed through the translation system, so a French, German, Spanish, Italian or Brazilian site showed an English form. It went unnoticed while few people found that screen; the new first-steps card now sends you there on purpose, from a step written in your own language. The labels are translated in all five languages.
* Changed: the interface is fully translated again in French, German, Spanish, Italian and Brazilian Portuguese, including everything added by the new first-steps card.

= 1.1.6 =
* Changed: the first-run experience has been rebuilt. Until now the dashboard offered a banner and a card that proposed the same thing, one above the other, and the card itself held nothing but a button. There is one call to action at a time, and the card is now the list of what is left to do: a progress bar, a count, one line per step with what it is for and a button that takes you there, and the line struck through once it is done.
* Fix: one of those steps said to add your logo and your social profiles, and sent you to a screen that has no logo field. The logo comes from your theme, not from this plugin. The step now describes what the screen actually offers.
* Changed: the end of the setup no longer runs everything together. The block listing what is already active has room to breathe, and the line that offers to analyse your pages no longer touches it.
* Changed: the card offering the guide appeared under the last button, and only after you pressed Save, so it arrived by surprise once the page was already finished. It now sits in the flow of the recap, and the button that ends the setup is the last thing on the page again.

= 1.1.5 =
* Changed: the line under the form said your address went to hacktheseo.com and Klaviyo, and that nothing else was sent. It meant the request carries nothing but your address, no site address and no measurement, and it is written that way on this page where the six fields are listed just above. Under a box that offers a newsletter, read quickly, it says the opposite: that we will not write to you again. It now names the two services and stops there, and the detail stays one click away in the privacy policy.
* Changed: the card can now be turned down two ways. "Not now" hides it for fifteen days instead of sixty. "Do not show this again" hides it for good. In both cases the form stays where you can find it, at the bottom of the Settings screen, because turning down an interruption is not the same as giving up the guide.
* Fix: the link to the privacy policy opens in a new tab so you do not lose what you typed, but nothing told people using a screen reader that it would. It now says so, the way WordPress itself does.

= 1.1.4 =
* Changed: the form that offers the guide has been rewritten and redrawn. It opens on a question rather than on a description, and it now looks like the rest of the plugin instead of like a WordPress error message: a title, one sentence, then the address field and the button side by side, the consent box on its own line, and the legal note in small grey type underneath.
* Added: the form also lives at the bottom of the Settings screen, permanently. Someone who said no the first time, or who wants the guide three months later, had no way of finding it again. The card at the top of the screens still appears once and still never comes back.
* Added: the form appears at the end of the first-run walkthrough, the moment someone has just seen what the plugin measures. It is not shown there to anyone who has already asked for the guide, and it never stands between you and the end of the walkthrough.
* Fix: a site could only ever request the guide once. A second request was answered with the same success message without anything being sent, so a site with several administrators, or anyone who mistyped their address the first time, was stuck with no way to correct it. Requests are no longer refused on that basis.
* Fix: this page said your site address travelled in the standard technical header of the request. That was true when it was written and it is no longer: the plugin now sets its own header, so the site address is not sent at all. The sentence has been corrected rather than left to declare more than what happens.
* Changed: the dashboard and the walkthrough said the analysis "sends no data anywhere". The analysis still sends nothing, but that sentence sat ten lines above a form that sends an email address, and an absolute in that position reads as a contradiction whatever it actually means. It now says what the analysis does, without the absolute.

= 1.1.3 =
* Added: an optional form to receive a short guide on how AI assistants read a WordPress site. You type your address and tick a box, and nothing happens at all unless you do both. The address goes to hacktheseo.com, which passes it to Klaviyo, the service that sends the emails. Nothing else is sent: not your site address, not your name, not one measurement. You are then sent a confirmation email, and you are subscribed only after you click it, so an address typed by mistake, or typed by somebody else, never receives anything.
* Changed: the plugin description and four screens no longer say that nothing ever leaves your site. That sentence was true, and it stops being true for anyone who uses the form, so it has been replaced by what stays true: the SEO work is computed on your own server, and every request the plugin can make waits for you to start it.
* Changed: the "External services" section of this page now declares hacktheseo.com and Klaviyo next to IndexNow, names the six fields that are sent, and links to both privacy policies.
* Fix: this page invited you to count the outbound call sites yourself and said there were nine. There were eight. There are nine now, and the breakdown is written out, so the count can be checked in a minute.
* Changed: the form never appears in the preview sandbox on wordpress.org, where every visitor is signed in as an administrator, and it never appears on the settings screen.

= 1.1.2 =
* Changed: the dashboard widget now draws the week. Seven bars, one per day, with the busiest crawler names underneath and the difference with the previous week. A day with no visit keeps a thin grey line rather than disappearing, because a missing column reads as missing data and not as a zero. Same figures as before, read in a second instead of a sentence.
* Changed: the two notices about your other SEO plugin no longer describe a risk that this plugin prevents. They said your indexing settings, your canonicals and your redirects "would be lost" without an import, and asked you to import "before uninstalling it". Neither is true since 1.1.0: Hack The SEO steps aside wherever another SEO plugin is in charge, so nothing is lost and nothing has to be uninstalled. They now say what the import actually gives you, that your other plugin keeps running and is not modified, and that the import can be undone.
* Changed: the reminder that appeared after a week no longer counts the days since detection. A number of days is not information, it is pressure, and the action it pushed towards is optional.

= 1.1.1 =
* Added: a dashboard widget, "AI crawlers this week". Until now the plugin only existed inside its own menu: an administrator who did not open that menu never saw the product again after installing it. The widget shows how many times AI crawlers read the site over the last seven days, how that compares with the week before, and which crawlers came. It reads the log that is already in your database, adds no query to the front end, and carries no promotion.
* Fix: the "Go Pro" link on the Plugins screen pointed at a page that returns 404. It is the one link the plugin shows outside its own menu, so every click on it was lost. It now points at the pricing page.
* Fix: the notice that tells you your import is done and that you may keep both plugins was never displayed. It was written and translated, but the function that renders it was not attached to anything, and the condition governing the second half read a setting that no file in this plugin ever writes. Both are corrected, and the notice is confined to the plugin's own screens and the Plugins screen.
* Changed: the review request now reaches sites it could never reach before. It asked for a review after 50 AI crawler visits, 15 redirects or 10 pages scoring 80, thresholds a small site may take months to cross, so on a new install the invitation could simply never appear. A new step opens on the first AI crawler visit, for three weeks, and only after the numbered milestones have been checked, so it never replaces a sentence carrying a real figure. The invitation also waits seven days after installation, and it now offers the support forum to anyone for whom something is not working, without ever hiding the review link.
* Added: the plugin records its installation date, once, at activation. Without it no rule of the form "and at least so many days after installing" could be written at all.
* Fix: the description said that moving to the commercial version picks your data up exactly as it is. That is true of the work you do page by page, which is stored in shared keys, and it is not true of this plugin's own settings, which are stored under their own names. The sentence now says which is which.

= 1.1.0 =
* Added: a read-only MCP server, at `/wp-json/htsfree/v1/mcp`. Claude Code, Claude Desktop and other MCP clients can read what the plugin measures: AI-crawler passages by page and over time, GEO, on-page and meta scores, the site-wide score distribution, the competing-pages report, redirects, the 404 log, llms.txt, the Markdown of a page, and the health check. Twelve abilities, and all twelve read: there is no write among them, and no setting that turns one on. It needs WordPress 6.9, where the Abilities API entered core; below that it does not register and nothing else changes.
* Added: the plugin now runs next to Yoast SEO, Rank Math, All in One SEO and SEOPress. On activation it detects the SEO plugin already in place and stops emitting whatever that plugin handles (meta tags, canonical, schema, sitemap, breadcrumbs, robots, and hreflang when a multilingual plugin owns it), so nothing is output twice. It never deactivates the other plugin and never changes its settings. A Compatibility screen lists every overlap and lets you take back any module, one by one. The AI crawler log, the GEO score and the cannibalization report have no front-end output and work regardless.
* Added: a weekly report by email. Once a week your own site sends its administrator a short message: how many times AI crawlers read the site and on how many pages, how many visitors arrived from an AI chat, which new broken links appeared, and how the site score moved. Nothing is sent on a week with nothing to report, every email carries a one-click unsubscribe link that works without logging in, and the report can be switched on or off from the AI visibility settings. It is sent by your own site through WordPress, so no third party is involved and no outbound call was added.
* Added: an "AI connection" screen. One button creates the WordPress application password and prints the line to paste into your client. The screen lists the twelve abilities with the capability each one needs, shows which client connected and when, and keeps the last fifty calls with their duration. It records what was called, never the arguments and never the answers.
* Added: the interface ships translated into French, Spanish, German, Italian and Brazilian Portuguese. Until now nothing loaded them: WordPress reads a plugin's own catalogues only when the plugin points at them, and otherwise waits for a package from translate.wordpress.org, of which none exists yet for this plugin. Both halves are fixed. Your site language is followed automatically, with no account and no setting to change. An official package, the day it exists, takes precedence on its own.
* Changed: every link leaving the plugin now goes through a single point, so it is possible to tell which screen sends people to the site and which one converts. The dashboard previously wrote tracking parameters onto an internal admin URL, where no measurement tool can ever read them; internal links now carry the originating screen instead, and the pricing page reads it back onto its outgoing links.
* Added: a way to say what is missing or broken, from the footer of every plugin screen. You write your message, optionally attach a summary of your setup (versions and active modules, never your site address and never a key), copy it, and open the support forum. Nothing is sent from the plugin and nothing is stored: the text never reaches the server, so it is never altered and there is nothing to delete later.
* Security: every MCP call is made by a signed-in WordPress user and checks a capability, `manage_options` for the site-wide readings and `edit_posts` for the four that concern a single page. An anonymous request cannot even list the tools. No ability returns unpublished or password-protected content, nor a visitor's IP address, referrer or user agent.
* Fix: the crawler report no longer lists a page that has been unpublished or password-protected since a crawler read it. Its rows stayed in the log, so its title could still appear.
* Fix: the "Set up the connection" button in the settings, and the Pro link on the AI connection screen, navigate again. Both were rendered as buttons carrying a link, which does nothing.
* Unchanged: the plugin still makes exactly the same nine outbound calls as before, and the bundled MCP library adds none. MCP is inbound: your client calls your site, and no third party is contacted.

= 1.0.25 =
* Fix: `Google-Extended` and `Applebot-Extended` have been removed from the AI crawler list. Neither is a crawler: Google documents that Google-Extended has no separate user agent string, and Apple documents that Applebot-Extended does not crawl web pages. Both were robots.txt tokens, so neither could ever have been detected. Apple is now tracked through its real crawler, `Applebot`.
* Added: `Claude-User` and `Claude-SearchBot`, Anthropic's current on-demand and search agents; `Perplexity-User`, Perplexity's on-demand fetcher; and `Google-CloudVertexBot`. Eighteen user agents are now matched, up from thirteen.
* Removed: `Gemini-Bot` and `CopilotBot`, which neither company publishes. Human visits arriving from Gemini and Copilot chats are still measured, through the referrer.

= 1.0.24 =
* Fix: updating from 1.0.22 or earlier no longer resets your settings. The rename migration ran after the modules had already written their defaults, so a module you had switched on could come back off.
* Fix: the migration now keeps each setting's autoload state instead of turning it off. WordPress 6.6 changed the wording stored in that column, and the check missed it, which added one database query per setting on every page.
* Fix: `[hts_breadcrumbs]` and `[hts_sitemap]` written in older posts render again. They were renamed in 1.0.21 without rewriting existing content, so visitors saw the raw shortcode text.
* Fix: the rename migration no longer runs when the commercial version is installed alongside. It shares the same setting names, and moving them emptied its data.
* Changed: the breadcrumbs block is now registered as `htsfree/breadcrumbs`, and the remaining French labels and untranslatable strings are translated: "Table of contents", "Breadcrumb", "Home", "Other AI", and the sitemap screen messages.

= 1.0.23 =
* Changed: every option and transient the plugin owns now carries the `htsfree_` prefix, as the directory requires. Your settings are migrated automatically on update; per-post SEO data is untouched.
* Fix: the Author URI now points to the wordpress.org profile, which answers in a second. The previous address took eleven, over the review tool's timeout.

= 1.0.21 =
* Changed: the two shortcodes are now `[htsfree_breadcrumbs]` and `[htsfree_sitemap]`, so every registered name carries a prefix longer than three characters.

= 1.0.20 =
* Fix: FAQ schema answers are no longer cut in the middle of a word. AI answer engines read this markup directly, so a truncated answer stayed truncated in their index.
* Fix: llms.txt descriptions no longer show leftover escape characters when page builders store their content as JSON.
* Improved: the AI visibility card now says "Visits from AI chats", so it is no longer mistaken for the crawler passage counter next to it.
* Changed: activating the plugin no longer redirects you. A dismissible welcome notice offers the setup instead, on the plugins list and on Hack The SEO screens only.
* Fix: with the Breadcrumbs module enabled, the breadcrumbs Gutenberg block is now offered in the block inserter. It was registered server-side only, so it rendered existing markup but could not be added to a page.
* Changed: the XML sitemap stylesheet, which is served publicly, no longer carries links to our own site and is now written in English. It previously showed French text and a "powered by" badge on every site.

= 1.0.18 =
* Fix: "Analyze my pages" no longer reports success when the requests were rejected; it now says so and gives the button back.
* Fix: redirecting or approving a 404 no longer claims success when the rule was refused; the entry stays in the list.
* Fix: the "Choose" button of the social share image is visible again and opens the media library.
* Fix: turning the XML sitemap off now flushes the rewrite rules, so /sitemap.xml stops answering with the home page.
* Fix: the "Who handles what?" step of the migration wizard now really changes what the site outputs, both ways.
* Fix: uninstalling removes the plugin transients again, and two "Repair" buttons of the Health screen do what they announce.

= 1.0.17 =
* Fix: the design system stylesheet is loaded again. In 1.0.16 the prefix rename also renamed the file path, so every admin screen rendered unstyled.

= 1.0.16 =
* Changed: every function, class, constant, hook, AJAX action, transient, nonce, admin page slug and script handle now uses the `htsfree_` prefix. Stored data keys are unchanged, so nothing is lost on update.
* Improved: inline styles and scripts no longer go through an output buffer; 33 of them are now plain strings handed to WordPress.
* Fix: `set_time_limit()` no longer shortens the execution window on hosts that allow more than 120 seconds, and never imposes one on hosts that allow unlimited.
* Fix: the breadcrumb separator saved from the settings screen is applied again.
* Fix: redirect and score queries build their `IN ()` lists from bound placeholders.
* Fix: removed an unused AJAX endpoint that could overwrite the breadcrumb settings without validation.

= 1.0.15 =
* Fix: the page title is now escaped once on output, so a meta title can never inject markup into the `<title>` tag.
* Fix: saving Schema Pro fields no longer fails with a server error when a field holds a list of values.
* Fix: the sitemap and migration notices only appear on Hack The SEO screens, and every notice can be dismissed with the standard WordPress control.
* Fix: on multisite, uninstalling now removes the cached sitemap of every subsite instead of the main site only.
* Fix: the canonical URL box in the editor is translatable, and no longer shows an icon in place of its title.
* Improved: all stylesheets are handed to WordPress instead of being written into the page.
* Improved: readme wording corrected on disk writes, translations and the paid version.

= 1.0.14 =
* New: a "First steps" checklist on the dashboard that adapts to what still needs setting up (indexing, permalinks, importing from another SEO plugin, company details, author profile, sitemap) and disappears once you are done.
* New: a guided tour of the dashboard (native highlight, no external library) that walks through your SEO score, AI visibility and the main screens. Starts from the "First steps" card and can be restarted anytime.
* New: edit the SEO meta title and description of your categories and tags directly on the term edit screen.
* Improved: the "Go Pro" and semantic-cocoon screens were redesigned to be clearer and more useful.
* Improved: the plugin is now fully internationalised, ready for translation through translate.wordpress.org.
* Fix: WooCommerce product rows in the posts list now always show an exempt state instead of an old editorial score left over from a previous version.
* Hardening: reinforced unslashing and sanitization of every admin form and request input, and reviewed all database access.
* Fix: redirects imported from another SEO plugin, and redirects whose URL contains accents or encoded characters, are now matched correctly instead of silently never firing.
* Fix: sending a post to the trash no longer replaces its redirect with a broken one.
* Fix: redirects now keep the incoming query string (utm_source, filters, sorting) when the destination has none.
* Fix: on sites using a static front page plus a posts page, the posts page now outputs its own title, description and canonical instead of the home page's.
* Fix: meta descriptions and titles are no longer corrupted on non-Latin content (Japanese, Chinese, Korean, Arabic, Cyrillic) or after an accented capital.
* Fix: category and tag archives are no longer set to noindex behind your back; only internal search and paginated pages get safe defaults.
* Fix: the meta description, schema and scores now refresh as soon as you edit a post, instead of describing the previous version for up to a week.
* Fix: the sitemap cron no longer loads the whole site in one pass (memory exhaustion on large sites), and deactivating the plugin no longer leaves /sitemap.xml answering incorrectly.
* Fix: the 404 log no longer freezes once full, and bot probes can no longer crowd out real 404s.
* Fix: the Markdown (.md) version of a post now respects membership and paywall plugins, and is no longer empty on shortcode-based page builders.
* Fix: every screen is now translatable; strings that were missing from the catalogue have been added.
* Fix: "Top pages seen by AI" counted SEO crawlers (Moz, Ahrefs, Semrush) as AI reads. Only genuine AI crawlers are counted now.
* Fix: running the analysis from the dashboard left the Actions screen claiming your pages had never been analyzed for up to five minutes. The cached views are now refreshed the moment the analysis finishes.
* Improved: OAI-SearchBot, the crawler behind ChatGPT search, is now recognised and logged.
* Improved: the "Go Pro" screen lost a redundant call-to-action that sat directly above the pricing table.

= 1.0.13 =
* New: edit the SEO meta title and meta description of your categories, tags and any public taxonomy, directly on the term edit screen. The front end already output these on category archives; you can now set them per term.
* New: a "First steps" checklist on the dashboard that guides your initial setup (make the site indexable, import from your previous SEO plugin, fill your company details, complete your author profile, submit your sitemap to Search Console). Steps are auto-detected where possible and the card disappears once everything is done.
* Translations: the new screens are fully translatable.

= 1.0.12 =
* Fix: FAQ and How-to auto-detection could truncate or miss the section on accented (e.g. French) content when the heading was preceded by multi-byte characters, because a byte offset was read as a character offset. Restored the byte-correct extraction.
* WooCommerce: product pages are no longer graded by the editorial content engine (which expects 800+ words and an H1 and therefore produced misleading low scores on products). Products now show an honest exempt state, previously stored misleading scores are cleaned up, and the overall score redistributes its weights accordingly. Meta title, description, social and advanced settings remain fully editable on products.
* Author schema: the Wikipedia, Wikidata, ORCID, Google Scholar and GitHub profile fields you fill in are now emitted as sameAs in the Person markup on the front end (they were collected but never output).
* Redirects: guard against pathologically long request paths in the regex matcher, invalid regex patterns are now rejected at CSV import instead of being silently stored, and the 404 counters now count exactly the same set of rows as the displayed list when named crawlers are filtered out.
* Hardening: DOM extension check restored in the content extractor for hosts without ext-dom.
* Interface: the "Go Pro" screen is now a full pricing page (Free / Pro / Ultra with a feature comparison), the Settings screen was redesigned and now includes the Health report as a tab, the Analytics screen was aligned with the paid layout, and the Actions and Health items were moved out of the top menu (Actions is reached from the dashboard). The dashboard "See my actions" button now points to the right screen.
* Honesty: paid-only capabilities are teased with the correct plan (Pro vs Ultra) and always as clearly labelled illustrations, never as hidden or locked data.
* Translations: the plugin is fully internationalised and the interface follows your site language; translations are delivered through translate.wordpress.org.
* Cosmetic: decorative characters removed from the schema type selector, the score panel and the sitemap pages.

= 1.0.11 =
* Fix (live front audit): llms.txt and llms-full.txt could return an unreadable (truncated) body on hosts that gzip-compress output, because an explicit Content-Length header no longer matched the compressed size. The header is no longer sent (same as robots.txt and .md pages), so the files now load correctly everywhere. Also fixed the Markdown alternate link on a static front page producing a malformed URL (domain.md); the site root no longer advertises a .md version.

= 1.0.10 =
* Second audit pass: fixed the Health screen wrongly telling you to disable a competitor, a global score that could store a stale value, competing-pages scan keeping unrelated pairs, a data-loss window for AI-bot tracking, times shown with a timezone offset, a few untranslatable strings, CSV import/export edge cases, and cleaner uninstall (multisite, author meta, on-disk sitemap cache). No functional loss.

= 1.0.9 =
* Security: password-protected posts can no longer leak their content through the Markdown (.md) routes or the llms.txt files. Reliability and SEO hardening from a full internal audit: taxonomy sitemaps are now served, no duplicate schema types, the "Service" schema is no longer emitted by mistake, redirect matching and UTF-8 handling improved, and several front-end performance paths were optimised.

= 1.0.8 =
* Schema detection improved: FAQ blocks rendered by modern Yoast are now recognised (class-based, comment-agnostic), so more of your existing FAQs produce FAQPage schema. Reference/source lists are no longer mistaken for HowTo tutorials, and numbered FAQ questions are read cleanly. Page titles aligned with the menu (Analytics, Redirects, Settings).

= 1.0.7 =
* Admin menu aligned with the rest of the Hack The SEO range: same labels and order (Dashboard, Actions, Redirects, Analytics, Content groups, Competing pages, Health, Settings, Go Pro).

= 1.0.6 =
* Markdown for agents: every published page is now also served as Markdown at /your-page.md (and via Accept: text/markdown content negotiation), with a Link rel=alternate hint in the HTML head so AI crawlers can discover it. 100% local, no request ever leaves your server. Can be turned off with the hts_free_md_enabled option.
* Automatic QAPage schema: when a page has real question/answer sections (question headings, details/summary blocks) and no FAQ schema, a single QAPage is now added to the existing JSON-LD graph. Never emitted empty, never duplicated, never on top of a FAQPage.
* Reviews: when a global Organization rating is enabled in the Schema settings, an auto-detected rating is no longer also attached to the page entity, so a page never carries two AggregateRating blocks.
* Accessibility: the blurred Pro preview is now hidden from screen readers, and the segmented tab controls are explicit buttons.

= 1.0.5 =
* Cocoons screen rebuilt as a card grid (one card per category) matching the rest of the plugin, with a clickable semantic-cocoon map drawn from your own pages. Consistent "pages below 50" and total-actions counters across the Dashboard, Actions and Cocoons screens.

= 1.0.4 =
* Three screens redesigned to match the rest of the plugin: the Site audit screen becomes an "Actions" screen with per-page action cards and estimated score impact; the AI crawlers screen gets a full analytics view (AI crawls, referred visits, per-bot cards, engagement); and the Cocoons screen now shows a realistic semantic-cocoon map built from your own pages.

= 1.0.3 =
* UI polish: the Competing pages, Health and Redirects screens now match the look of the rest of the plugin (severity dots on filters, refined status badges and iOS-style toggles, consistent loaders).

= 1.0.2 =
* Redirects & 404 log: major reliability backport from the Pro engine. Reciprocal redirect loops (A to B then B to A after a rename) are now prevented automatically. The 404 log default view now surfaces only real 404s (pages with an internal link or confirmed search traffic) instead of drowning in bot/scanner noise, with a "Show all" toggle. Anchored path matching (a probe like /console no longer hides a real /consoles-de-jeux/ page), a flood cap with one-click noise purge, deterministic pagination, and performance guards on large logs.

= 1.0.1 =
* Compatibility guard with Hack The SEO Pro: when the Pro plugin is active, the free plugin now stays fully dormant (the Pro version is a superset and takes over). Prevents any conflict if both plugins end up active at the same time.

= 1.0.0 =
* Initial public release.
* Meta tags: title, description, Open Graph, Twitter Cards, automatic alt text fallback.
* Schema JSON-LD: Article, BreadcrumbList, Person, Organization, LocalBusiness, FAQPage, HowTo, VideoObject and more.
* XML sitemap: index and per-type sitemaps, image/video/news extensions, XSL stylesheet, disk cache, noindex-aware.
* Redirects: 301, 302, 307, 410, regex rules, automatic 301 on slug change, admin table, CSV import/export. Served in PHP; the `.htaccess` file is never modified.
* 404 log with hit counts, local slug-similarity suggestions, and one-click conversion into a redirect.
* Breadcrumbs: shortcode, PHP function, Gutenberg block, BreadcrumbList JSON-LD.
* Robots: per-post noindex/nofollow and a virtual `robots.txt` served through the core `robots_txt` filter.
* Canonical URLs with conflict detection.
* Table of contents generated from H2/H3 headings (off by default).
* Optional removal of `/category/`, `/tag/` and `/product-category/` permalink bases, with automatic 301 (off by default).
* Virtual `/llms.txt` for LLM crawlers.
* Author schema (E-E-A-T) built only from user profile fields.
* SEO panel in the editor: 21 local checks, plus a composite global score and a freshness column.
* Keyword cannibalization detection, computed locally, with a recommended action per pair.
* AI crawler detection, server-side, for GPTBot, ChatGPT-User, ClaudeBot, Claude-Web, anthropic-ai, PerplexityBot, Google-Extended, Gemini-Bot, CCBot, Bytespider and Diffbot.
* Migration wizard importing from Yoast SEO, Rank Math, All in One SEO and SEOPress, including JSON-LD recovery from the rendered homepage.
* Competing-SEO-plugin detection and warning.
* Health check: sitemap, schema, canonical and HTML self-tests.
* IndexNow module, disabled by default (the only external service; see "External services").
* Uninstall preserves data by default; full deletion is opt-in.
