=== Livada SEO ===
Contributors: livada
Tags: seo, schema, sitemap, redirects, local-seo, woocommerce, multilingual, indexnow, ai
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.53.7
License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

SEO + AEO plugin for WordPress: meta tags, sitemaps, Schema.org, Open Graph, on-page analysis, redirects — free, no trial. Pro adds AEO, multi-location, image optimisation & more.

== Description ==

**Livada SEO** is a fast SEO + AEO (AI visibility) plugin built for tourism, hospitality and local-business sites. The free version covers real SEO hygiene end to end — no trial, no time limit, nothing crippled.

It ships **zero front-end JavaScript** and zero front-end CSS (except an opt-in 1 KB stylesheet for breadcrumbs). The admin UI stays clean and the database stays small.

An optional licence (https://livada.io/livada-seo) unlocks the advanced layer — multi-location business schema, AEO, automatic image optimisation, hreflang and more — inside this same plugin. No second plugin to install, no settings to re-enter.

= Free, no licence required =

* **Meta** — title templates, meta description, canonical, robots
* **XML sitemap** — posts and pages
* **Schema** — WebSite, Article, and a single-location business entity (Campground, Hotel, Bed & Breakfast, Restaurant, Store, and eight more types — whichever fits your business)
* **Open Graph & Twitter Cards** — auto-fill + per-post OG image override
* **Breadcrumbs** — shortcode, template tag, and an Elementor dynamic tag
* **On-page analysis** — 16 SEO checks + Flesch reading-ease score, live in the metabox
* **Robots.txt manager** — virtual robots.txt with a sitemap directive
* **AI-powered suggestions** — title, meta description, focus keyword and rewrite, via Anthropic Claude, OpenAI or Google Gemini (bring your own API key)
* **Image alt-text review** — list every attachment missing alt-text, edit inline, optional one-click AI-generated suggestion
* **AI Visibility Score** — a free 0–100 score showing how ready your site is to be found and cited by ChatGPT, Perplexity, Gemini and Google AI Overviews
* **Yoast / Rank Math / AIOSEO / SEOPress importer** — batched, lossless migration of your existing SEO data and redirects
* **Migration Proof** — a before/after diff of every `<head>` tag your site publishes, so you can verify nothing was lost when you switch — instead of importing your settings and going silent like every other import tool
* **Page Output inspector** — see exactly what any URL on your site publishes: head tags and JSON-LD, side by side
* **Redirect manager** — 301/302, hit counter, CSV import/export — plus a **404 monitor** (throttled logging, one-click "convert to redirect")
* **Full REST API & WP-CLI** for every feature above

= Pro — one licence, unlocked inside this same plugin (https://livada.io/livada-seo) =

* **Advanced schema** — multi-location LocalBusiness (a camping group, hotel chain, multi-outlet restaurant), Service nodes, FAQPage, Person/E-A-T author schema, HowTo, Product, Event, Recipe, Review, Offer
* **HTML sitemap** and **Google News sitemap** (auto-listed when posts within the last 48 h match)
* **IndexNow** — async ping to Bing/Yandex via WP-Cron
* **Table of Contents**
* **Automatic image optimisation** — auto-alt fallback, lazy-loading, async decoding, applied across your content
* **Analytics injection** — GA4, Matomo, Microsoft Clarity
* **Programmatic OG image generator** — 1200×630 PNG rendered on demand
* **AEO** — `/llms.txt`, `/llms-full.txt`, AI content markers, speakable schema, Knowledge-Graph entity — designed for ChatGPT, Perplexity, Claude, Gemini, AI Overviews
* **AI Bots Access** — fine-grained control over which AI crawlers can access your content
* **Hreflang** — native support for Polylang, WPML, TranslatePress and per-post manual JSON override
* **WooCommerce** — Product + Offer + AggregateRating + Review schemas, with variation support
* **Site Audit** — daily WP-Cron crawl, 10 per-post checks + 7 site-wide checks, sortable dashboard, CSV export
* **Bulk editor** — edit titles / meta descriptions / focus keywords / noindex flags across many posts at once
* **Internal link suggestions** — live in the metabox, scored, with a "cornerstone" boost
* **AI Visibility Repair** — one-click fixes for the free score above, plus a "Why AI Picks Competitors" comparative analysis
* **Rank Tracking & AI Citations** — real, metered checks against live AI engines and Google Search Console
* **NAP Coherence Audit, Provenance Watch** — diagnostic tooling for agencies managing several sites
* **MCP server for Claude Code** — bundled TypeScript Model Context Protocol server lets Claude Code directly drive every endpoint from a chat conversation

= Why Livada SEO? =

* **Genuinely light** — 0 KB front-end JS/CSS vs ~80 KB for Yoast, ~60 KB for Rank Math
* **One plugin, one licence** — no separate "Lite" and "Pro" plugins to keep in sync; a licence key simply unlocks more inside the install you already have
* **AEO built-in** (Pro) — `/llms.txt`, AI markers and a Knowledge-Graph entity, tuned for ChatGPT, Perplexity and Google AI, in the same plugin rather than a separate tool
* **TranslatePress hreflang** — a native adapter (most competitors only cover Polylang/WPML)
* **Migration Proof** (free) — verify nothing was lost when you switch, tag by tag, instead of trusting an import and going silent
* **MCP integration** — manage your SEO config from Claude Code or any MCP client

= Designed for =

* Camping / hotel / B&B sites
* Local-business multi-outlet operators
* Multilingual tourism sites (FR/EN/NL/DE/IT)
* Developers who want code they can actually read and modify
* Anyone who wants a real, working free SEO plugin — with a clear, honest upgrade path if they outgrow it

== Installation ==

1. Upload the `livada-seo` folder to `/wp-content/plugins/`, or install directly from the WordPress.org Plugins screen.
2. Activate the plugin through the **Plugins** menu in WordPress.
3. Go to **Livada SEO → General** to configure the active modules and (optionally) your Anthropic API key for AI alt-text.
4. Open **Livada SEO → Schema** and **Livada SEO → Locations** to fill in your business data.
5. (Optional) Migrate from Yoast or SEOPress under **Livada SEO → Tools**.
6. Run the first **Site Audit** under **Livada SEO → Site Audit**.

= Migrating from Yoast SEO =

1. Keep Yoast active during the import.
2. Go to **Livada SEO → Tools → Import from Yoast SEO** and click **Start Import**.
3. The import is batched (50 posts per request) and migrates titles, meta descriptions, focus keywords, canonical URLs, OG images, robots flags, site-wide title templates, social profiles, and Yoast Premium redirects.
4. After the import succeeds, deactivate Yoast and verify a few posts manually before deleting it.

= Migrating from SEOPress =

Same flow, under **Livada SEO → Tools → Import from SEOPress**.

== Frequently Asked Questions ==

= Does it work with Elementor / JetEngine / ElementsKit? =

Yes. The on-page analyzer renders Elementor content for accurate scoring. The sitemap auto-strips template-only post types (`elementor_library`, `jkit-header`, `jkit-footer`, `e-landing-page`, `oceanwp_library`, `astra-advanced-hook`, `cartflows_step`, `cartflows_flow`, `fl-builder-template`, `wpbakery_layout`, `tcb_lightbox`, `brizy-template`, `jet-*`) so they never leak into the index.

= Does it work with WooCommerce? =

Yes. The `woocommerce` module emits Product + Offer + AggregateRating + Review JSON-LD on product pages, and auto-augments the sitemap to include `product`, `product_cat`, `product_tag` when WooCommerce is active.

= Does it work with TranslatePress? =

Yes. Native hreflang adapter pulls translated URLs from `TRP_Url_Converter` and silences TranslatePress's own hreflang output to avoid duplicates. Polylang and WPML are also supported, plus a per-post manual JSON override. Site Audit also flags languages your translation plugin lists but cannot actually resolve for a given post — an orphan-translation check, on top of the hreflang tags.

= How does the AI alt-text generation work? =

Add an Anthropic API key under **General Settings**. The key is stored encrypted at rest with AES-256-CBC using a key derived from your `wp_salt('auth')`. The bulk image editor's **AI** button calls the Claude API with a vision-capable prompt and pre-fills the alt field with a ≤125-character suggestion you can edit before saving. You can also wire any other provider via the `livada_seo_image_bulk_ai_provider` filter.

= Is the plugin compatible with caching plugins? =

Yes. Sitemaps set `DONOTCACHEPAGE` and a `Content-Type: application/xml` header, so page-cache plugins skip them automatically. The 404 monitor uses object-cache throttling (60 s per path) so logging won't flood the DB even under bot traffic.

= How do I use the bundled MCP server? =

The `mcp-server/` directory ships a Node.js stdio MCP server. Build it once with `npm install && npm run build`, then register it with Claude Code:

    claude mcp add livada-seo \
      --env WP_URL=https://example.com \
      --env WP_USER=admin \
      --env WP_APP_PASSWORD="xxxx xxxx xxxx xxxx xxxx xxxx" \
      -- node /absolute/path/livada-seo/mcp-server/dist/index.js

Generate the Application Password under **Users → Profile → Application Passwords**. The MCP exposes 28 tools covering settings, meta, redirects, audit, locations, images, AI alt-text, sitemap diagnose, IndexNow, and more.

= Will it conflict with Yoast / Rank Math / AIOSEO / SEOPress? =

The plugin detects and warns about active SEO plugin conflicts on the admin notices bar. You can keep them active during a migration, but you should only run one in steady state.

= How do I uninstall cleanly? =

Use **Plugins → Delete**. The `uninstall.php` removes every option, every post meta with the `_livada_seo_` prefix, both custom tables (redirects + 404 log), every plugin transient, and clears scheduled cron events.

== Screenshots ==

1. Dashboard with clickable issue cards.
2. Site Audit page with summary cards + per-post grades.
3. Bulk Editor — edit dozens of posts at once.
4. Multi-location LocalBusiness configuration.
5. Image SEO bulk with AI alt-text generation.
6. SEO metabox with desktop/mobile SERP preview, live checks, and internal-link suggestions.

== Changelog ==

= 1.53.7 — 2026-09-14 =
* Fixed: a plugin update could get stuck showing "Automatic update is unavailable for this plugin" for hours on a fully licensed site. Root cause: WordPress caches its own `update_plugins` check for up to ~12h, and a momentary hiccup at the moment that cache was built (a slow licence re-check, a network blip) could bake in "no download package" even though the licence was fine a minute later — nothing WordPress recomputes on its own until the next cycle. Fix: the plugin now notices this exact stuck state on any admin page load and clears the stale WordPress cache itself as soon as it confirms the licence is genuinely valid, so the real update reappears without anyone needing to click "Check for updates". Found live on hotel-du-roc04.fr (2026-09-14).

= 1.53.6 — 2026-09-07 =
* Changed: the MCP Server Card (`.well-known/mcp/server-card.json` and its two sibling paths) now also asserts `name`, `version`, `description`, `serverUrl` and an explicit empty `tools` array at its root, in addition to the existing `serverInfo`/`websiteUrl` fields — same true values, just also in the shape a third-party checker (ora.ai's "AgentReady" standard) expects at the root. No single official MCP discovery-file spec exists yet (researched properly: at least four incompatible drafts coexist); this hedges across shapes the same way this file already hedges across three candidate paths, the same pattern real MCP servers use in the wild (e.g. Apify).

= 1.53.5 — 2026-09-03 =
* Changed: the plugin no longer leads its own description with "Free" — it now opens with what it is ("SEO + AEO plugin for WordPress"), free-and-no-trial mentioned alongside the free feature list instead of as the first word. Prompted by Florin: a paying customer opening their Installed Plugins screen every day shouldn't read "Free plugin" first about something they're paying for.
* Added: a "Pro active" badge now appears on this plugin's row on the Installed Plugins screen when the current site has a valid licence. The header description is the same file for every install, licensed or not — this is the first per-site indicator of licence status on that screen.

= 1.53.4 — 2026-09-03 =
* Fixed: the plugin's own header description (shown on the Installed Plugins screen) still listed redirects and the 404 monitor as licence-only, a leftover from before 1.53.3 made them free. Found live in wp-admin on a production site. No functional change — text only.

= 1.53.3 — 2026-09-03 =
* Changed: Redirects and the 404 monitor are now free — no licence required. Closes a real gap found in a competitive review: Rank Math ships both free. Everything else in Pro is unchanged.

= 1.53.2 — 2026-08-31 =
* Fixed: a licence re-check that failed to reach the server (a timeout, a firewall blip, a brief server-side outage) could silently disable every Pro feature for up to an hour, even on a perfectly valid licence — found live on camping-la-ferme.com. The plugin now keeps the last confirmed status through up to 3 days of failed re-checks, and only disables Pro features on an explicit rejection from the server or after 3 full days with no successful check at all.

= 1.53.1 — 2026-08-30 =
* Fixed: Visibility Receipt could time out on a site with several translations — the button scored every language in one server request, and a real 6-language TranslatePress site took long enough to exceed the server's execution time limit. Found testing live the same day 1.53.0 shipped, fixed a few hours later: the button now fetches the language list instantly, then scores each language with its own request, filling in the table as each one comes back instead of freezing on one long wait.

= 1.53.0 — 2026-08-30 =
* Added: Visibility Receipt — a button in the SEO metabox, on multilingual sites (Polylang, WPML, TranslatePress), that scores every translation of the current post through the same engine as the free AI Visibility Score and shows them side by side against the source language (e.g. "FR 88/A — DE 61/C"). Answers the question the site-wide score never could: is this specific translation actually as visible to AI engines as the original? On-demand only, one click at a time — the shared scoring engine rate-limits per site, so this is deliberately not an automatic background crawl. Requires a licence, like Hreflang, which it builds on for the per-post translation map.

= 1.52.0 — 2026-08-30 =
* Added: Site Audit now checks translation coverage on multilingual sites (Polylang, WPML, TranslatePress). A new site-wide card names the plugin in use and how many languages are configured; a new per-post check flags languages a plugin lists site-wide but cannot actually resolve for that specific post ("orphan" translations). Works with any of the three systems, independently of whether Livada Translate is installed.

= 1.51.1 — 2026-08-27 =
* Fixed: Migration Proof's "Snapshot" button could trigger a critical error on a site with no active licence — introduced by 1.51.0 the same day, found and closed a few hours later while preparing a separate free build. The Page Output inspector it depends on is free again, and is now also listed in its own right above.

= 1.51.0 — 2026-08-27 =
* Added: Livada SEO is now a genuine free/Pro plugin. The free tier covers real SEO hygiene end to end — meta tags, sitemap, Schema.org, Open Graph, on-page analysis, breadcrumbs, robots.txt, the Yoast/Rank Math/AIOSEO/SEOPress importer, AI-powered suggestions, image alt-text tools, the free AI Visibility Score, and Migration Proof — with no time limit and nothing crippled. An optional licence (livada.io/livada-seo) unlocks the advanced layer inside this same plugin, no second plugin to install. See "What's in the box" above for the full split.
* Added: a clear notice on the Dashboard, and a "PRO" badge next to each module in General settings, when a Pro module is checked in your settings but isn't running because no licence is active — previously it just silently did nothing, with no indication why.
* Changed: single-location business schema — the common case, one camping, one hotel, one gîte — is now free. Only multiple locations under one install requires a licence.
* Changed: a brand new install now only activates the free modules by default. Pro modules stay off until you choose to enable them and activate a licence, instead of appearing pre-checked with nothing behind them.
* Fixed: a licence check that had silently stopped doing anything for one diagnostic tool (a duplicated line meant it loaded for every admin regardless of licence) is now closed.

= 1.50.4 — 2026-08-27 =
* Fixed: a page's shared link preview (Facebook, LinkedIn, X, Slack) could show raw placeholder text like "%sep%" or "%sitename%" instead of your real site name, when that page's title had been imported from Yoast SEO. The preview title now always resolves correctly.

= 1.50.3 — 2026-08-21 =
* Fixed: Migration Proof, AI Readiness Proof, and Rank Tracking are now listed in the plugin's own navigation (they were already reachable from the WordPress admin menu, just missing from Livada SEO's own tab/quick-links bar).
* Fixed: the last 66 untranslated strings (the Abilities API added in 1.50.0) now have French translations — full French coverage, zero gap.

= 1.50.2 — 2026-08-20 =
* Fixed: the Rank Tracking screen now shows the exact Google account email to add in Search Console, with a one-click Copy button, instead of just saying "add our service account" without saying which one.

= 1.50.1 — 2026-08-20 =
* Fixed: Rank Tracking now tells you exactly what to do when it can't fetch your position data yet, instead of a bare error code — most commonly, that means adding our reporting account as a user on your Search Console property, and it now says so by name.

= 1.50.0 — 2026-08-20 =
* Added: a connected AI agent (via WordPress's own Abilities API / MCP Adapter) can now do almost everything this plugin's admin screens can do — manage redirects, multi-location business entries, image alt-text, the 404 monitor, sitemap diagnostics, IndexNow pings and site audits, on top of what it already could. Every action still requires the same admin permission your REST API already enforces — this only adds a new, standard way for an agent to discover and call what was already there, nothing is newly exposed.

= 1.49.0 — 2026-08-19 =
* Added: a second, independent AI-usage-preference signal — the IETF's own emerging "Content-Usage" standard (draft-ietf-aipref-attach), alongside the Cloudflare Content-Signal support already in this plugin. Same honest logic (states a preference only when your AI Bots Access rules unanimously agree, published as a robots.txt rule and as an HTTP header on every page and API response). Nothing new to configure — it restates your existing AI Bots Access decisions in a second, standards-track vocabulary.

= 1.48.0 — 2026-08-19 =
* Added: the NAP Coherence Audit screen now shows why it matters — ~68% of business contact details ChatGPT and Perplexity return are accurate (SOCi 2026 Local Visibility Index), meaning one in three AI local recommendations gets an address, phone number or opening hours wrong. Also newly listed under "What's in the box" below — the audit existed since S6 but was never in this list.

= 1.47.0 — 2026-08-19 =
* Added: TDM Rights Reservation (EU) — publish the W3C TDMRep signal (`/.well-known/tdmrep.json` plus a matching HTTP header and meta tag pair) to explicitly reserve or waive Text and Data Mining rights under the EU Digital Single Market Directive. Separate from AI Bots Access above it: that controls whether a bot can fetch a page live to answer a question, this controls whether your content may be mined into a bulk AI-training dataset — you can allow one and reserve the other. Off by default; nothing is published until you choose a state under Settings → AI Bots Access.

= 1.46.1 — 2026-08-19 =
* Fixed: several admin screens added over the past two weeks (Rank Tracking, AI Bots access controls, Markdown for agents, Provenance Watch, the AI-agent Abilities API) were showing in English on a French site. All 119 affected strings are now translated.

= 1.46.0 — 2026-08-19 =
* Added: AI-powered suggestions (SEO title, meta description, focus keyword, rewrite) and AEO FAQ generation can now run on OpenAI or Google Gemini, not just Anthropic Claude — pick your provider under General settings and add its API key. Image alt-text generation keeps using Claude's vision model regardless of your choice.

= 1.45.1 — 2026-08-18 =
* Fixed: found live right after 1.45.0 shipped — once a page's HTML is already cached, an AI agent asking for it in Markdown could silently receive the cached HTML instead, until that cache entry expired. Not fixable from inside the plugin (a cached response never reaches WordPress at all — same root cause as the 1.43.1 AI-bot fix), so the AI Bots screen now explains it plainly and gives you a ready, copy-paste list of the AI assistants that actually need this (the live, on-demand ones — not the bulk crawlers) to exclude from your cache plugin's own settings.

= 1.45.0 — 2026-08-18 =
* Added: pages and posts now answer directly in Markdown when an AI agent asks for it (`Accept: text/markdown`) — no third-party service or paid CDN plan required, and it works even on hosts not behind Cloudflare. A cache bypass is applied to that specific response so it can never be served to a regular visitor by mistake.

= 1.44.1 — 2026-08-17 =
* Fixed: `/auth.md` now uses the exact heading format third-party agent-readiness checkers look for, and no longer overstates which of the plugin's own discovery endpoints require authentication (two of them are intentionally public).

= 1.44.0 — 2026-08-17 =
* Added: the plugin now registers 14 capabilities with WordPress's own Abilities API (6.9+) — reading and updating settings, post SEO meta, redirects, dashboard stats, and the config-vs-reality checks below — so any compatible tool can discover and use them without plugin-specific glue code.
* Added: an MCP Server Card is now published for AI agent tooling, describing the plugin's real, already-live discovery routes honestly — never claiming a network connection the plugin doesn't actually offer.
* Added: the AI Bots screen can now test live whether the site returns Markdown when an AI agent asks for it, and tells you exactly where to turn it on (Cloudflare's dashboard) when it isn't working yet.
* Added: publishes a standard "Agent Skills" index so AI agents can discover six ready-to-use capabilities (SEO health check, manage SEO metadata, manage redirects, dashboard snapshot, site audit, fix missing alt-text) and how to call them.
* Added: three previously admin-only checks (Content-Signal conflicts, AI bot access reality, migration verification) are now available over the REST API for external tools, with sensible rate-limiting so they can't be used to hammer your own site.
* Added: `/auth.md` describes how to authenticate with the plugin's API (WordPress Application Passwords) for any tool that looks for it.
* Added: once a page-tag removal is proven safe, the Provenance screen now writes out the exact fix to apply — never applies anything automatically.
* Added: the daily Provenance watch now also checks your most recently changed pages, not just the home page, so a change scoped to a single page doesn't slip through unnoticed.
* Changed: "Tested up to" WordPress 7.0.4.

= 1.43.1 — 2026-08-16 =
* Fixed: the AI Bots hard block could be silently bypassed by a full-page cache (found live: 8 blocked bots were still reaching livada.fr with HTTP 200 despite being hard-blocked). The screen now tells you when this is happening and exactly which cache setting closes it, and the block's own 403 response can no longer get cached by mistake.

= 1.43.0 — 2026-08-16 =
* Added: the plugin now publishes a `/.well-known/api-catalog` listing and a `Content-Signal` line in robots.txt, so AI crawlers and agent tooling can discover your API and your search/AI-training preferences the way the emerging standards expect.
* Added: the AI Bots screen now catches it when another layer — a CDN or security plugin like Cloudflare — silently overrides the Content-Signal preference you configured, by re-reading your live, public robots.txt the way a real crawler would.
* Added: the AI Bots screen now tests each bot's real access live and flags the two contradictions that matter — a bot you allowed that's actually being blocked by something outside WordPress, or a bot you blocked that's still getting through.

= 1.42.0 — 2026-08-15 =
* Added: a new "Migration Proof" screen that verifies a migration from another SEO plugin didn't lose anything — it captures what each page publishes before and after, tag by tag, instead of importing your settings and going silent like every other import tool.
* Added: an opt-in public page showing a live, re-checkable "AI Readiness Proof" — reopen it any time and every check re-runs on the spot, so it's never a stale screenshot.
* Fixed: pages built entirely with Elementor's newer "atomic" widgets (4.0+) were scored as if they had no content at all, no matter how much text they actually contained.
* Fixed: the AI-referral counter now tells you plainly when your host's full-page cache is likely hiding part of your real traffic, instead of quietly presenting the number as complete.

= 1.41.0 — 2026-08-12 =
* Added: the Provenance screen can now watch your homepage automatically, once a day, in the background — opt-in, off by default. Most days it finds nothing and stays silent. The moment a genuinely new tag appears (say, after a theme or plugin update), it automatically checks whether removing it would be safe — the same check the "Test removal" button already does by hand — and emails you once. It never repeats a finding you've already been told about.

= 1.40.1 — 2026-08-12 =
* Fixed: on multilingual sites, the XML sitemap could list your homepage's other-language versions all pointing at the same address as your default language, instead of each language's real page — while the page itself already advertised the correct addresses. Found by checking the real, live sitemap on a converted site rather than trusting the code. The sitemap no longer publishes an address it cannot actually translate for that page.

= 1.40.0 — 2026-08-10 =
* Added: a new "Provenance" screen — for the first time, see exactly which plugin, theme, or WordPress core file wrote each tag your site publishes, and test in one click whether removing it changes anything, without ever touching what a real visitor sees.
* Fixed: the removal test could report a callback "probably safe to remove" without anything ever actually being removed — including, in one specific case, on sites running a page-cache plugin with HTML minification enabled, which could silently swallow the test's own verification. It now reliably says when nothing was tested instead of showing a false "safe."
* Fixed: the keyword-density fix in 1.39.0 could count a keyword word inside an unrelated word ("spa" inside "espace", "hotel" inside "hotellerie"), inflating the score. It now only counts whole-word matches.
* Security: the new Provenance screen's removal-test tool now checks the full URL (scheme, host, and port) of any page it re-fetches, not just the hostname, requires an exact successful response, and never follows a redirect — closing a theoretical path to an internal service sharing the site's own domain name.

= 1.39.0 — 2026-08-10 =
* Fixed: keyword density could report a near-zero score on genuinely well-written, on-topic content. For a two-word focus keyword, one coincidental exact match of the full phrase was silently blocking the far more representative per-word count — so a page using its keyword's two words dozens of times separately, in natural writing, could still score red. Found on a real page (13 and 22 separate occurrences on 1,902 words, scoring 0.1% instead of a realistic ~1.2%).
* Improved: the French translation catalogue is complete again — every user-facing string now has a French translation.

= 1.37.0 — 2026-08-09 =
* Fixed: pages WordPress itself keeps out of search — your internal search results above all — were being published as indexable. The plugin was discarding WordPress's own indexing instructions instead of honouring them. Measured on three live sites before the fix.
* Fixed: a page could carry two `robots` tags at once, written by two parts of this plugin. It now carries exactly one, combining every source, with the most restrictive instruction winning.
* Fixed: re-importing from Yoast, Rank Math, All in One SEO or SEOPress never un-hid a page. If you had hidden a page, fixed it at the source and re-imported, it stayed out of Google — and out of your sitemap — however many times you ran the import.
* Added: a clear warning when your site is set to ask search engines to stay away. That single checkbox, buried in Settings → Reading, hides every page you have; now it says so and takes you straight to it.

= 1.36.0 — 2026-08-08 =
* Fixed: when your translation plugin already publishes your language versions, Livada SEO no longer publishes a second set. Your pages declare one coherent set instead of two competing ones, of which a search engine silently keeps only one.
* Fixed: your language codes say what you mean. A single English translation now addresses every English speaker rather than British readers only. The country code stays when you really do target several regions in one language.

= 1.32.0 — 2026-08-06 =
* Added: the new "Cited from" column lists the sites an AI engine actually drew on behind each answer that mentions you — so you can see where it found you, not only that it did.

= 1.29.5 — 2026-07-09 =
* Security: hardened AI Citations, Schema, WooCommerce reviews, breadcrumbs, and the settings import tool against a JSON output edge case, plus a couple of internal redirect-handling and export refinements. No action needed — update recommended for everyone.

= 1.29.4 — 2026-07-09 =
* Fixed: your AI Citations score no longer looks falsely perfect when the measurement server only manages to check some of your target queries — the score is now calculated across all your target queries, and a clear note shows when a run comes back incomplete.

= 1.29.3 — 2026-07-08 =
* Improved: AI Citations tracking is now more reliable on cache-heavy hosting setups — a settings change (like adding your own API key) is no longer served from a stale cache on the next scheduled check.

= 1.29.1 — 2026-07-08 =
* Fixed: adding (or replacing) your own AI Citations API key now triggers an immediate check in the background — previously the score stayed on old sample data until the next weekly check or a manual "Run now" click.

= 1.29.0 — 2026-07-05 =
* Fixed: the **Bulk Editor** now works when you filter by **Pages** (and any content type), not only Posts — selecting "Pages" previously showed a "Cannot load" error.
* Added: a `wp livada-seo boussole` command for site admins to review AI-visitor signals day by day from the command line.

= 1.28.0 — 2026-06-28 =
* Improved: the **AI Visibility Score** now correctly recognises your FAQ sections whatever builder or layout you use — Elementor toggles and accordions, JetKit accordions and other addons all count, and questions are detected even when their titles use a different HTML tag. Sites with real FAQs that were under-scored now read accurately.
* Fixed: removed a false "cache may hide your schemas" warning shown to WP Rocket users — verified that WP Rocket never touches your JSON-LD data, so the alert was unnecessary.

= 1.27.0 — 2026-06-27 =
* Improved: your **llms.txt** (the AI-readability file) now lists your key pages as real links, so AI assistants and agents can navigate straight to them — and it passes Google's agentic-browsing check. Applies to every site automatically.

= 1.26.1 — 2026-06-23 =
* Improved: the **Boussole panel** is now a compact, full-width band with all three cards at a matched height — same bold look, much lower profile on the dashboard.

= 1.26.0 — 2026-06-23 =
* Improved: the **Boussole (AI visibility) panel** on the dashboard has a bold new look — a dedicated, easy-to-spot panel with a compass emblem, a large headline number for AI-referred visits, per-assistant bars (ChatGPT, Gemini, Perplexity…) and clear crawl stats. It no longer blends into the other sections, so your AI visibility speaks at a glance. Fully French.

= 1.25.0 — 2026-06-20 =
* New: **French-first readability analysis.** The Flesch reading-ease score now uses the Kandel-Moles formula tuned for French (the English formula under-rates French text), and three new checks join the content analysis: passive-voice overuse, transition words, and long sections with no subheading.
* New: **AI FAQ generator (AEO).** A "Generate AEO FAQ" button in the SEO metabox writes 4–6 question/answer pairs phrased the way a real visitor asks an AI assistant — concise, factual and citable — ready to drop into your page and your FAQ schema. Uses your own AI key (BYOK).
* Changed: French translation of the new readability and FAQ labels.
* Changed: clearer, more honest wording in the plugin description (single-tier "fair pricing", AEO presented as built-in rather than exclusive).

= 1.24.4 — 2026-06-20 =
* New: a built-in **Help & Documentation** page (in the Quick links bar and the side menu) — a 5-step getting-started guide, one-click links to the online documentation, tutorials and the contextual Livada AI assistant, and a "set up each feature" map that takes you straight to the right screen.
* Improved: clearer plain-language intros at the top of the Schema, Locations, Redirections and Social pages so non-technical clients understand what each one does.
* Changed: French translation of the new Help page and the page intros.

= 1.24.3 — 2026-06-20 =
* New: you can now **remove your own AI API key (BYOK)** on the AI Citations page — a "Remove my saved key" option sends you back to the free weekly sample. Typing a new key replaces it; leaving the field blank now reliably keeps your saved key (it is no longer wiped when you save other settings).
* Changed: the "Repair my AI visibility" page now points to **AI Citations built into Livada SEO** to track real citations, instead of linking out to third-party tools.
* Changed: French translation of the new dashboard Boussole panel, the Quick links bar and the updated AI Citations labels — no more mixed English/French on these screens.

= 1.24.2 — 2026-06-20 =
* Fix (important): the "Repair my AI visibility" page could trigger a critical error and fail to load, due to typographic quotes that had crept into the page template and broke PHP parsing. The page now loads correctly. This affected the page on every site — updating is recommended.

= 1.24.1 — 2026-06-20 =
* Polish: the dashboard "Quick links" row no longer repeats the top tab bar. It now surfaces only the screens that have no tab — AI Visibility, Repair AI Visibility, Why AI Picks Competitors, AI Citations, AI Bots Access, 404 Monitor and Bulk Editor — so every page stays one click away with no duplicate buttons.

= 1.24.0 — 2026-06-20 =
* New: **Boussole on the dashboard** — your AI visibility now shows directly inside Livada SEO. A rolling 30-day panel: visits sent by AI assistants (ChatGPT, Perplexity, Gemini, Copilot…), AI bot crawl activity, and how many days had a signal. Anonymous and aggregated (no IP, no visitor identifier); logged-in users are never counted.
* New: **Quick links row** at the top of the dashboard — one-click access to every Livada SEO screen, including the AI pages (AI Visibility, Repair, Why AI Picks Competitors, AI Citations, AI Bots Access) that were previously only reachable from the side menu.
* Improved: Boussole keeps each day locally for 30 days (flagged as sent) instead of deleting it after upload, so the dashboard always has data to show. No change to what is transmitted.

= 1.23.0 — 2026-06-19 =
* New: **AI Citations (Share of Voice)** — for your target queries, a weekly check of whether AI engines (Perplexity Sonar) actually cite your business, at what rank, and which competitors take the spot. This is an indicative measure (AI answers vary and are personalised), distinct from the on-site AI Visibility Score and from Boussole referral traffic. Cost stays in your hands: one free sample query each week, or bring your own API key (BYOK) to track all your queries — you pay only your own usage.
* Improved: smarter auto-suggested target queries — leads with the precise "{type} in {city}" query (and a star-rating variant for lodging) instead of a generic one, which under-reported real citation visibility.

= 1.21.1 — 2026-06-13 =
* Fix: Boussole now collects reliably without depending on an admin visit. The table and daily cron are created/armed on the front end (lazily, on the rare AI-referrer/AI-bot request and in init), so passive client sites no longer silently skip collection.

= 1.21.0 — 2026-06-12 =
* New: Boussole — opt-in (default OFF) anonymous AI-visibility statistics. Counts visits from AI assistants (ChatGPT, Perplexity, Gemini, Copilot…) and AI bot crawl activity, aggregated per day/page/source. Never any IP, visitor identifier or user-agent. Daily batch to livada.io (active licence required).

= 1.14.1 — 2026-06-01 =
* Fixed: **Wikidata entity ID field was auto-filled by browsers with the admin email address.** Chrome / Firefox / Safari aggressively auto-complete any plain `<input type="text">` with stored values (most commonly the admin email). Observed in production: the Wikidata field arrived pre-filled with `livada@gmx.fr`; the server-side regex `^Q\d+$` correctly rejected it, but the previously stored Q-id was silently wiped on every Save. Two-layer fix: (a) the HTML input now carries `autocomplete="off"` + `data-lpignore="true"` + `data-1p-ignore="true"` + `spellcheck="false"` to block the browser at the source; (b) the save handler now PRESERVES the previously stored value when the submitted value is non-empty but malformed (assume autofill), and only clears the setting when the input is explicitly empty. Recommended for anyone running 1.14.0 — re-open Réglages → AEO and Save once to confirm your Q-id sticks.

= 1.14.0 — 2026-06-01 =
* Added: **Signal 11 — Wikidata entity (off-site identity).** New AEO setting `aeo_wikidata_id` (format Q followed by digits, e.g. Q140007358) in General Settings → AEO — Knowledge Graph. When filled, the canonical Wikidata URL `https://www.wikidata.org/entity/Qxxxx` is automatically appended to the schema `sameAs` array of the primary LocalBusiness/Organization entity. This anchors the business in the structured knowledge base that ChatGPT, Perplexity, Gemini, Claude and Google AI Overviews consult to identify and cite real-world entities.
* Added: **AI Visibility — 11th check.** The score now evaluates Wikidata presence (max 8 points). Green when a valid Q-id is declared (and auto-injected into sameAs); orange when the value is set but malformed; red when no Wikidata entity is declared. Zero external HTTP call — purely setting-driven, matching the plugin's "no per-client API cost" design constraint.
* Notes: Existing sites scoring 100/100 will temporarily lose ~8 points until their Wikidata Q-id is declared, then return to 100 — by design, to surface the new actionable lever.

= 1.8.5 — 2026-05-05 =
* Added: **AEO — Knowledge Graph admin UI.** New "AEO — Knowledge Graph" section in General Settings exposes the four organization fields that previously had no UI: organization description, founding year, founder name, and areas of expertise (knowsAbout, one topic per line). Used by both the Organization JSON-LD entity and /llms.txt.
* Fixed: **Knowledge Graph @type was hardcoded to Organization.** The front-page Organization JSON-LD now reflects the configured Schema → Business Type. A hotel emits @type:Hotel, a campground emits @type:Campground, a restaurant emits @type:Restaurant, etc. The @id is also derived from the type (/#hotel, /#campground, …). Allow-list: Hotel, Campground, BedAndBreakfast, LodgingBusiness, Resort, Hostel, Motel, VacationRental, Restaurant, LocalBusiness, Store, TouristAttraction, MedicalBusiness, HealthAndBeautyBusiness, SportsActivityLocation, GovernmentOrganization, NGO. Anything else falls back to Organization.
* Fixed: **/llms.txt "Content" section listed WordPress categories instead of the curated expertise topics.** When `aeo_org_knows_about` has entries, /llms.txt now uses those for "This site publishes content about: …". Falls back to WP categories only when the field is empty.
* Added: **/llms-full.txt now lists Pages before Posts.** A new "## Pages" section (max 50, ordered by menu_order then title) is emitted before "## Posts" so AI engines see the static high-value pages (Rooms, Rates, Restaurant, Contact) on hospitality / service sites.

= 1.8.4 — 2026-05-01 =
* Fixed: **Dashboard "Sitemap refresh" and "IndexNow" cron events stayed "not scheduled" forever.** They are not recurring crons by design — sitemap is a 12 h transient cache invalidated on save_post, IndexNow uses one-shot scheduled events per URL change. The dashboard now shows the sitemap cache freshness ("fresh — refreshes in 11 hours" or "on demand") and the next pending IndexNow ping ("ping in 30 seconds" or "on demand"). The `wp livada-seo doctor` command was updated to match.
* Fixed: **Sitemap cache freshness query targeted a non-existent transient key** (`livada_seo_sitemap_index`). The sitemap module actually stores per-post-type / per-taxonomy transients prefixed `livada_seo_sitemap_*`. The dashboard and doctor command now query the maximum expiry across all of them.

= 1.8.3 — 2026-05-01 =
* Fixed: **Score not recalculated when meta updated via REST API.** `PUT /livada-seo/v1/meta/{id}` and `/meta/bulk` now call `analyze()` after writing. Standard WP REST `/wp/v2/posts/{id}` updates (title, content, featured_media) also trigger re-analysis via `rest_after_insert_post`. Direct `_thumbnail_id` changes (Quick Edit, custom plugins) trigger re-analysis via `updated_post_meta`.
* Fixed: **`No images found in content` no longer scores RED.** Service / listing pages without inline images are now scored ORANGE instead — featured image is a separate signal that stays RED on its own when missing.

= 1.8.2 — 2026-05-01 =
* Fixed: **Focus keyword matching is now accent-insensitive and word-aware.** "réparation PC Castellane" now correctly matches "Réparation et maintenance PC à Castellane" in titles, descriptions, H1s, first paragraphs, URL slugs, and density. New normalisation helper strips diacritics (NFD via intl + fallback table) and matches on a per-word basis when the contiguous phrase isn't found.
* Fixed: **Featured image detection** — `_thumbnail_id` written via REST `featured_media` is now picked up correctly even when the WP object cache hasn't been refreshed. Triple-check (helper + meta + getter).
* Fixed: **Elementor HTML widgets are now analysed.** When `Elementor\Plugin::frontend->get_builder_content()` returns empty (common during save_post in REST contexts), the analyser walks the raw `_elementor_data` JSON tree and extracts text from html, editor, heading, button, and image widgets. Pages built with HTML widgets no longer score 0.
* Fixed: **URL slug match is now word-by-word.** Slug "reparation-maintenance-pc-castellane" matches keyword "réparation PC Castellane" because every keyword word is found, even when intermediate slug segments interleave.

= 1.8.1 — 2026-04-30 =
* Fixed: **"Check for updates" link returned "Le lien suivi est expiré"** because the post-redirect URL (`?livada_seo_check_update=done`) re-triggered the nonce verifier with no nonce in the query. The handler now only acts when the parameter equals `1` and ignores the redirect marker, so the round-trip completes cleanly.

= 1.8.0 — 2026-04-30 =
* Added: **Self-hosted update checker.** The plugin now polls a JSON manifest at `https://livada.fr/livada-seo-updates/info.json` every 12 hours and surfaces new versions on the WordPress Extensions page exactly like a wp.org plugin would. Click "Mettre à jour maintenant" to upgrade in place — no SFTP, no manual ZIP upload. Also adds a "Check for updates" link on the plugin row to bypass the 12 h cache. Workflow + manifest schema documented in `UPDATES.md` and `info.example.json`.
* Added: `Update URI:` plugin header pointing to the manifest, so WordPress knows this plugin manages its own updates and never fetches from wp.org by mistake.
* Added: Filters `livada_seo_update_url`, `livada_seo_update_cache_ttl`, `livada_seo_update_disabled` for dev / staging overrides.

= 1.7.1 — 2026-04-30 =
* Fixed: **robots.txt rendered on a single line** when the stored content lost its line breaks (DB import quirk, copy-paste from a flattened source). The Robots module now normalises CRLF/CR to LF, defensively splits glued directives by injecting newlines before known keywords (`User-agent:`, `Allow:`, `Disallow:`, `Sitemap:`, `Crawl-delay:`, `Host:`), trims trailing whitespace per line, and ensures a final LF. Output is now always one directive per line, regardless of how the option got stored.

= 1.7.0 — 2026-04-30 =
* Added: **Onboarding wizard** — 4-step welcome page (business basics → modules → optional Anthropic key → first audit) that fires once on first activation. Skippable at any time, persists each step immediately.
* Added: **AI rewrite mode** — fourth `type` for the AI suggester. Pass arbitrary text as `extra` (or fall back to the post excerpt) and the model returns a rewritten version that keeps language + facts + length. Available via the metabox-side AI surface, the REST endpoint, and the MCP tool.
* Added: **Google Search Console keywords import** — under Tools, upload a "Top queries" CSV exported from GSC; Livada matches each URL to a post and stores the top 25 keywords with clicks / impressions / position. Surfaced in the SEO metabox as a collapsible "Search Console — top queries" panel.
* Added: **Internal Link Graph** module + admin sub-menu. Crawls every published post, counts inbound / outbound internal links, flags orphan posts, top hubs, and lonely cornerstones (cornerstone with zero inbound links). 12-hour cache, AJAX rebuild button, dashboard cards filter the view by type.
* Added: **Programmatic OG image generator** (opt-in module `og_image`). Renders a 1200×630 PNG on demand at `/wp-json/livada-seo/v1/og-image/{post_id}.png` when no custom OG image is set on the post. Brand color + accent color settings; system-font detection with GD built-in font 5 fallback. Cached 24 h per post.

= 1.6.0 — 2026-04-30 =
* Added: **Settings JSON export / import** under Tools — back up the full plugin configuration (settings + multi-location data) as a portable JSON file and re-import it on another site or after a reset. The Anthropic API key is intentionally stripped from the export.
* Added: **Activity Log** — new dedicated table `{prefix}livada_seo_activity_log` (capped at 1 000 rows, auto-trimmed on insert) and admin viewer under **Livada SEO → Activity Log**. Hooks into settings updates, locations updates, redirect add/delete, AI suggestions, and Site Audit runs. Each entry records who, when, from which context (web / ajax / rest / cron / cli), what event, and a summary.

= 1.5.1 — 2026-04-30 =
* Added: **Person / Author schema (E-A-T)** — singular blog posts now reference their author by `@id` and emit a dedicated Person node in the @graph with bio, avatar, jobTitle, sameAs (pulled from the WP user profile + custom user meta `livada_seo_job_title`, `livada_seo_same_as`, plus standard social fields when present). Author archives also emit the Person node so the entity is canonicalised across the site. `worksFor` is linked to the primary business location.
* Added: **Sitemap inventory widget** on the dashboard — table of every post type + taxonomy emitted in the index with their published URL counts, deep links to each sub-sitemap, and a total at the top.

= 1.5.0 — 2026-04-30 =
* Added: **Live JSON-LD schema preview** in the SEO metabox — collapsible panel that fetches the exact `@graph` Livada SEO would emit on the front-end without rendering anything. New REST endpoint `GET /schema/preview/{id}`.
* Added: **CSV export of all SEO data** under Tools — one row per post with title, permalink, meta, score, schema type, location, noindex, cornerstone, etc. Useful for backups, agency handoffs, content audits.
* Added: **Redirect chain / loop detector** as a new Site Audit site-wide check. Walks the redirects table for cycles and chains (target is itself a redirect source) up to 5 hops. Pure DB introspection.

= 1.4.0 — 2026-04-30 =
* Added: **Bulk AI alt-text fill** in the Image SEO page — one button to generate AI alts for every empty alt on the visible page (250 ms throttle).
* Added: **Bulk schema-type assigner** in the Bulk Editor — select multiple posts, pick HowTo / Product / Event / Recipe / Review / Offer (or clear), apply in one shot.
* Added: **Plugin footprint widget** on the dashboard — transient cache size, redirect count, 404 log size, last audit run, and cron event status with relative "next run".
* Added: **Live keyword density meter** in the metabox — directional 0–100 % indicator that complements the on-save full-content density check.

= 1.3.0 — 2026-04-30 =
* Added: **Bulk AI Fill** in the Bulk Editor — toolbar to generate AI suggestions for missing meta descriptions / SEO titles / focus keywords across the visible posts in one shot, with an opt-in "overwrite existing values" mode. 250 ms throttle between API calls.
* Added: **Cornerstone reverse counter** in the SEO metabox — shows how many cornerstone posts already link to the current page so editors can spot weakly-linked content.
* Added: **Quick-wins admin notice** on Livada SEO pages and the WP Dashboard — surfaces missing setup (LocalBusiness empty, Anthropic API key absent, > 50 % of posts without a focus keyword) with one-click links to the right page. Per-user dismissible.

= 1.2.0 — 2026-04-30 =
* Added: **AI title / description / focus-keyword suggestions** in the metabox. New "AI ✨" button next to each field calls Claude with the post context (title, focus keyword, content excerpt, locale) and replaces the value with a length-capped suggestion. Reuses the Anthropic API key already configured for image alt-text. Closes the last "AI content writer" gap vs Rank Math Content AI / AIOSEO AI Generator.
* Added: REST endpoint `POST /ai/suggest/{id}` with body `{ type, save }`.
* Added: MCP tool `livada_ai_suggest` for Claude Code integration.

= 1.1.2 — 2026-04-30 =
* Added: **Hreflang manager UI** in the SEO metabox — repeater under Advanced to define per-post hreflang URLs without editing post meta directly. BCP-47 normalisation on save (lang lowercase, region uppercase, `_` → `-`, x-default kept verbatim).
* Added: **`wp livada-seo doctor`** WP-CLI self-test that surfaces WP/PHP versions, missing extensions, custom tables presence, scheduled cron events, sitemap rewrite freshness, robots.txt directive, LocalBusiness completeness, Anthropic key roundtrip, and SEO plugin conflicts. Pass `--ping` to additionally probe the REST namespace.

= 1.1.1 — 2026-04-30 =
* Added: Schema validation buttons in the SEO metabox — one-click links to **Google Rich Results Test** and **Schema.org Validator** for the current post URL.
* Added: **Live Flesch reading-ease** in the metabox checks panel — the score now updates as you type the meta description, matching the band the on-save analyser would report.
* Added: **Broken internal-link detector** — new `broken_internal_links` per-post check in Site Audit that flags `<a>` references to trashed, draft, or non-existent posts. Pure DB introspection (`url_to_postid()`), no outbound HTTP.

= 1.1.0 — 2026-04-30 =
**Major release.** Adds Site Audit, multi-location LocalBusiness, Cornerstone marker, Image SEO bulk editor with AI alt-text, WooCommerce schemas, Google News sitemap, MCP server. Brings the plugin to ~95% feature parity with Rank Math PRO.

* Added: **Site Audit** module — daily WP-Cron crawl, 8 per-post checks + 5 site-wide checks, sortable dashboard, CSV export.
* Added: **Multi-location LocalBusiness** — manage N business locations under a single WP install, with per-post `_livada_seo_location_id` to retarget Article publisher / Service provider / Offer seller references.
* Added: **Cornerstone content marker** — flag flagship posts, score boost in internal-link suggestions, dashboard card + filter.
* Added: **Image SEO bulk editor** — list attachments missing alt-text, inline AJAX edit, bulk apply, optional one-click AI alt-text via Anthropic Claude vision API.
* Added: Anthropic API key field with **AES-256-CBC encryption at rest** under General Settings.
* Added: **WooCommerce module** — auto-emits Product / Offer / AggregateRating / Review schemas on product pages with full variation support.
* Added: **Google News sitemap** at `/sitemap-news.xml`, advertised in the index only when matching posts exist in the 48 h window.
* Added: **Yoast SEO importer** — batched migration of post meta, title templates, social profiles, and Yoast Premium redirects.
* Added: **TranslatePress hreflang adapter** alongside the existing Polylang and WPML support.
* Added: **404 Monitor** with throttled logging and one-click "convert to redirect".
* Added: **Bulk redirect operations** — multi-select delete, CSV import, CSV export.
* Added: **Bulk Editor** admin page for titles / descriptions / focus keywords / noindex flags.
* Added: **Internal link suggestions** in the metabox, live, with cornerstone boost.
* Added: **Mobile SERP preview** in the metabox alongside the desktop one.
* Added: **Flesch reading-ease score** stored as a separate `_livada_seo_readability_score` post meta and surfaced as an admin column.
* Added: New schema types — **HowTo, Product, Event, Recipe, Review, Offer**.
* Added: Tourism / lodging fields — star rating, room count, pets allowed, check-in / check-out times, amenities, aggregate rating.
* Added: **WP-CLI commands** — `audit`, `sitemap diagnose`, `sitemap flush --type=news`, `import yoast`.
* Added: **REST API** — 30+ endpoints covering every action (settings, meta, redirects, locations, audit, 404, images, sitemap diagnose, Woo schema preview, IndexNow ping).
* Added: **MCP server for Claude Code** — TypeScript stdio implementation under `mcp-server/`, 28 tools, Application Password auth.
* Added: **Sitemap auto-strip** — known template CPTs (Elementor, JetEngine, ElementsKit, Brizy, OceanWP, Astra, CartFlows, Beaver, Thrive) excluded by default.
* Added: **Dashboard cards clickable** to filtered post-list (low-score, missing description, noindex, no-keyword, cornerstone, 404s, audit issues).
* Added: **CSV import/export** for redirects.
* Fixed: `LIVADA_SEO_DEBUG` was enabled by default — now off unless explicitly defined.
* Fixed: Sitemap transient cache now invalidates when `_livada_seo_sitemap_exclude` or `_livada_seo_noindex` post meta changes outside `save_post` (REST/AJAX/CLI).
* Fixed: SEOPress import nonce mismatch.
* Fixed: Removed dead `ajax_import_seopress` admin handler.
* Fixed: Hex color validation in the analysis admin column.

= 1.0.3 =
* Initial public release: meta, sitemap, schema, OpenGraph, redirects, breadcrumbs, analysis, robots, IndexNow.

== Upgrade Notice ==

= 1.14.1 =
Patch critique pour les sites passés en 1.14.0 : le champ Wikidata était auto-rempli par les navigateurs avec l'email admin, qui était ensuite rejeté côté serveur et effaçait silencieusement le Q-id stocké à chaque Save. Correction en double couche (HTML autocomplete=off + sanitize qui préserve la valeur en cas de soumission malformée). Mise à jour fortement recommandée.

= 1.14.0 =
Adds Signal 11 (Wikidata entity) to the AI Visibility score and auto-injects your Wikidata URL into the schema sameAs of your primary business — anchoring you in the structured knowledge base that ChatGPT, Perplexity, Gemini and Google AI Overviews use to identify and cite real-world entities. Set your Q-id in General Settings → AEO. Sites already at 100/100 will temporarily lose ~8 points until they declare their Q-id, then return to 100.

= 1.8.5 =
Adds the AEO Knowledge Graph admin UI (4 fields), fixes the hardcoded Organization @type so hotels / campgrounds / restaurants etc. identify correctly to AI engines, and replaces WP categories with the curated knowsAbout topics in /llms.txt. /llms-full.txt now lists Pages before Posts. Recommended for any site using the AEO module.

= 1.8.4 =
Cosmetic: the dashboard no longer shows misleading "not scheduled" status for sitemap and IndexNow — those aren't recurring crons by design.

= 1.8.3 =
Fixes the last two analysis edge cases: REST API meta updates now trigger score recalculation, and content-less pages no longer get penalised for the absence of inline images. Recommended.

= 1.8.2 =
Fixes several long-standing analysis bugs: accent-insensitive keyword matching, Elementor HTML widget content extraction, featured image detection via REST API, and word-by-word URL slug matching. Strongly recommended.

= 1.8.1 =
Fixes the "Check for updates" link that erroneously returned "Le lien suivi est expiré" after a successful round-trip. Recommended for everyone on 1.8.0.

= 1.8.0 =
Adds a self-hosted update checker. Once installed, every future version automatically appears as "Mettre à jour maintenant" on the Extensions page — no more manual ZIP uploads.

= 1.7.1 =
Cosmetic fix: robots.txt is now always rendered with one directive per line, even if the stored option lost its line breaks during a DB import.

= 1.7.0 =
Adds an onboarding wizard for new installs, AI rewrite mode, GSC keywords CSV import, an internal link graph admin page, and an opt-in programmatic OG image generator.

= 1.6.0 =
Adds settings JSON export/import for portable backups and an activity log of plugin actions.

= 1.5.1 =
Adds Person/Author schema with E-A-T signals and a sitemap inventory widget on the dashboard.

= 1.5.0 =
Adds a live JSON-LD schema preview in the metabox, a full SEO-data CSV export, and a redirect chain/loop detector in Site Audit.

= 1.4.0 =
Adds bulk AI alt-text fill, bulk schema-type assignment, a dashboard footprint widget, and a live keyword density meter.

= 1.3.0 =
Adds bulk AI fill for empty meta in the Bulk Editor, a cornerstone reverse counter in the metabox, and a quick-wins admin notice that points to unfinished setup steps.

= 1.2.0 =
Adds AI-powered title/description/keyword suggestions in the SEO metabox. Configure an Anthropic API key under General Settings to enable.

= 1.1.2 =
Minor release. Run `wp livada-seo doctor` after upgrading to validate the install end-to-end.

= 1.1.1 =
Minor release. Re-run the Site Audit to pick up the new broken-link check.

= 1.1.0 =
Major release. Run the Site Audit after upgrading to surface any new issues. The legacy LocalBusiness settings still work as "Location 1" — open the new Locations page to migrate them into the multi-location store. No database migration is required.
