=== TamRank SEO ===
Contributors: tamrank
Tags: seo, xml sitemap, schema, redirects, meta tags
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 1.3.6
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Know exactly what to fix. Meta tags, schema, sitemap, redirects and a full SEO audit, with the fix next to every score. Surprisingly clean.

== Description ==

TamRank is a WordPress SEO plugin that doesn't just tell you what's wrong, it shows you exactly what to fix. It brings the essentials together in one clean, uncluttered interface: meta titles and descriptions, social (Open Graph) previews, an XML sitemap, schema markup, redirects, 404 monitoring, your Search Console numbers and a continuous SEO audit with clear scoring.

Every screen stays clean and uncluttered: clear scores and plain-language steps on what to improve next, instead of traffic-light dots that read like a report card. It is calm, practical guidance that helps you improve your search rankings without turning SEO into a second job. If you have outgrown a heavier SEO plugin, TamRank is a clean, lightweight alternative to Yoast SEO and Rank Math.

Switching over? The built-in migration wizard imports your existing Yoast SEO and Rank Math metadata, so you keep your titles, descriptions and settings.

**Core features (free):**

* Meta title, description and canonical management per post, page and taxonomy term
* A focus keyword plus up to four secondary keywords per page, with live scoring as you write
* Google Search Console connection: clicks, impressions and average position in your WordPress dashboard (last 7 and 28 days)
* Social (Open Graph) title, description and image
* XML sitemap with configurable content types
* Robots.txt editor
* Schema markup builder with 14 types, reusable templates and custom JSON-LD
* SEO audit overview with scoring and filter pills
* 404 monitor and redirect manager
* Migration wizard for Yoast SEO and Rank Math data
* Automatic indexing requests on publish and a manual "Request indexing" action per post
* Automatic WebP conversion with picture-tag output, and a bulk run for your existing media library
* Static llms.txt output, so AI crawlers get a structured summary of your site
* Built-in .htaccess editor with a backup before every write and an automatic restore if the site stops responding

**PRO features:**

* AI meta generator — titles, descriptions and alt text via a hosted AI endpoint
* Topical authority clustering and internal linking suggestions
* SEO audit per-post detail panels — full per-page breakdown with recommendations
* SEO change tracker — every edit logged with score impact
* Priority engine, slug synonyms, redirect chain detection
* Index status column and daily bulk index-status scanning
* Google PageSpeed Insights integration

TamRank PRO is a separate add-on, not bundled in this free plugin. After purchase you receive the PRO add-on by email and install it like any other plugin; it then unlocks the features listed above. The free plugin is fully functional on its own and never installs or downloads the add-on for you.

== Installation ==

1. Upload the `tam-rank` folder to `/wp-content/plugins/` or install through the WordPress admin.
2. Activate the plugin via the **Plugins** screen.
3. Open **Tam Rank → Settings** to run the onboarding wizard.
4. That's it — the free plugin is fully functional. PRO features come from a separate TamRank PRO add-on (installed like any other plugin); **Settings → License** explains what the free version includes and how to add PRO.

== External services ==

TamRank communicates with `api.tamrank.com` (operated by TamRank) for the following purposes. All calls are HTTPS-only.

* **Setup tips opt-in (optional, requires consent).** When you check "Yes, send the tips" on the wizard success screen, the plugin sends your site's admin email, the chosen UI language, your site URL, the plugin version and an anonymous onboarding-variant marker (used only to pick which tips series to send) to `https://api.tamrank.com/v1/sites/email-optin`. This enrolls you in a short series of educational emails about TamRank features. Unsubscribing from any email removes you from the list. No tracking pixels, no marketing blasts. Without consent this call is never made.
* **Site registration (on explicit action — not on activation).** Activating the plugin does *not* contact any server. The first time you click "Connect with Google" to link Google Search Console, the plugin requests a free API key from `https://api.tamrank.com`. To prove you control the domain before any key is issued, the plugin runs a short ownership handshake: it asks the TamRank server for a one-time token, briefly publishes that token at `https://your-site/.well-known/tamrank-challenge.txt`, and the TamRank server fetches it back to confirm the match. That token is single-use and short-lived, it is *not* the API key, and the path returns 404 when no handshake is in progress. Only your site domain, site URL and plugin version are sent. The API key is requested once, cached, and is required for TamRank's hosted SEO services (Google Search Console integration, schema validation).
* **Google Search Console data (proxied through TamRank).** When you connect Google Search Console, the OAuth authorisation and every subsequent Search Console request — impressions, clicks, average position and per-page index status — are routed through `https://api.tamrank.com/v1/search-console/...`, not called against Google directly. TamRank performs the OAuth token exchange on your behalf and returns the data, which is then cached in your WordPress database. Nothing is sent until you explicitly click "Connect with Google".
* **Automatic indexing / "Request indexing" (optional, off by default).** When automatic indexing is enabled (it is off by default) or you click "Request indexing" on a post, the post's URL — not its content — is sent to `https://api.tamrank.com/v1/search-console/index-url` (and its status checked via `.../index-status`) so the page can be submitted to search engines. This requires a connected Search Console property and never runs without one.
* **License activation (PRO add-on only).** The separately-installed TamRank PRO add-on sends its license key together with your site's API key to `https://api.tamrank.com/v1/sites/upgrade` to verify and activate the license. The free plugin has no license-key field and never makes this call; it is listed here only for completeness.
* **AI features (PRO add-on only).** Provided by the separate PRO add-on: AI meta generation, alt-text generation, internal-link suggestions and topical-authority analysis send the relevant post content to `https://api.tamrank.com/v1/...` endpoints. These features are off by default and only fire on user action. The free plugin sends no content to these endpoints.

In addition, the separate TamRank PRO add-on uses one third-party Google service directly:

* **Google PageSpeed Insights (PRO add-on only).** PageSpeed testing is a PRO feature. When you run a PageSpeed test in the PRO add-on, the URL of the page being tested is sent (using your own Google API key) to Google's PageSpeed Insights API (`https://www.googleapis.com/pagespeedonline/v5/runPagespeed`) and the resulting performance metrics are returned. This only happens on your explicit action. The free plugin does not make this call. Google's terms: https://developers.google.com/speed/docs/insights/v5/about — Google privacy policy: https://policies.google.com/privacy.

The TamRank service is operated by TamRank (Netherlands). Privacy policy: https://tamrank.com/privacy-policy/ — Terms of service: https://tamrank.com/terms-of-service/. Contact: info@tamrank.com.

== Third-party libraries ==

This plugin bundles the following minified third-party libraries. Their unminified source is available at the locations below:

* **ApexCharts** v4.7.0 (MIT) — https://github.com/apexcharts/apexcharts.js
* **D3.js** v7.9.0 (ISC) — https://github.com/d3/d3
* **Plus Jakarta Sans** font (SIL Open Font License 1.1) — https://github.com/tokotype/PlusJakartaSans

== Frequently Asked Questions ==

= Does TamRank work alongside Yoast SEO or Rank Math? =

Yes for migration purposes. The onboarding wizard imports your existing SEO data from Yoast or Rank Math. Running both active is not recommended as they will duplicate meta output.

= Is a PRO license required? =

No. The full meta management, sitemap, schema builder, audit, 404 monitor and redirect features work for free. The separate TamRank PRO add-on adds the AI tools, topical authority, change tracker and priority engine.

= How is my data stored? =

All SEO data is stored in standard WordPress post meta and options. Custom tables are used for redirects (the PRO add-on adds its own tables for change logs, topical maps and slug synonyms). At uninstall you can optionally drop these tables via the **Privacy & Data** toggle.

= Is TamRank a free alternative to Yoast SEO? =

Yes. Meta management, the XML sitemap, the schema builder, the SEO audit, the 404 monitor, redirects, WebP conversion, llms.txt and the .htaccess editor all work in the free plugin. You get a focus keyword plus four secondary keywords per page, where Yoast SEO free gives you one. The separate TamRank PRO add-on adds the AI tools and the topical authority map; you never need it to run TamRank.

= How do I migrate from Yoast SEO to TamRank? =

Install TamRank and open the onboarding wizard. It detects Yoast SEO (and Rank Math), tells you how many items it found and imports your titles, descriptions and settings. Your existing plugin's data is left untouched, so you can deactivate it once you are satisfied and go back if you are not.

= Does TamRank support llms.txt? =

Yes, in the free plugin. TamRank can publish a static llms.txt so AI crawlers get a structured summary of your site instead of guessing from your HTML.

= Where can I report a bug or ask a question? =

Use the support forum on this page. That is the fastest route, and the answer stays visible for anyone with the same question. For account or billing questions, use https://tamrank.com/contact/.

== Screenshots ==

1. Dashboard — overall SEO score, Search Console clicks, impressions and position, and your prioritised SEO task list.
2. SEO audit — site-wide score with an Excellent / Good / Needs-attention breakdown and the most common issues across your pages.
3. Post editor meta box (SEO tab) — focus keyword, meta title and description with a live optimization score and improvement checklist.
4. Post editor meta box (Content tab) — image alt-text and WebP status plus internal and external link analysis.
5. Schema markup builder — automatic structured-data coverage with reusable templates and a live per-page overview.
6. Redirect manager — 301/302 redirects with automatic chain detection and one-click creation from the 404 monitor.
7. Settings — enable or disable individual features, with sitemap, robots.txt and technical SEO options.
8. Migration wizard — import your existing Yoast SEO or Rank Math metadata in one guided run, with a preview of what will be imported. Your old plugin's data is left untouched.
9. Social preview — see how a post looks on Facebook, X, LinkedIn and Instagram before you publish, straight from the post editor.
10. Redirect manager — 301, 302, 307 and 410 rules in one list, with CSV import and export, hit counts per redirect, and suggested targets from your 404 log.

== Changelog ==

= 1.3.6 =
* New: built-in .htaccess editor with backup before every write, a sandbox parse-test before saving and a fail-safe self-check after saving that restores the previous version unless the site verifiably still responds (Apache/LiteSpeed only; read-only on nginx). Respects DISALLOW_FILE_EDIT/DISALLOW_FILE_MODS and is super-admin-only on multisite.
* Changed: the content score is now a weighted average per category instead of a flat sum of sub-checks, so the category label is the single source of truth and the maximum is a real 100. Keyword checks no longer pass for free when no focus keyword is set; they are marked not applicable and the remaining categories are renormalised. Existing pages can shift a few points.
* Fixed: hardcoded credit total in the API client and license manager, an IndexNow label on a Search Console submission, a dead rollback deep link in the migration banner and an AJAX endpoint without a caller.
* Fixed: FAQ schema now recognises class-based accordions and no longer picks up a call-to-action heading as a question.
* UI: refined tooltip system, empty-state pass (icon + guidance + one clear action) and motion/feedback polish across the admin.
* Hardening: security and schema should-fixes from the wp.org pre-submission audit.

= 1.3.5 =
* Compliance: moved the last add-on-only feature code out of the free plugin. The redirect-chain detector and the change-history timeline (post meta box + dashboard) now live entirely in the TamRank PRO add-on and render through neutral extension hooks. The free plugin ships no gated or locked add-on functionality.
* Internal: added redirect and meta-box extension hooks (tamrank_redirect_presave, tamrank_redirect_saved, tamrank_meta_change_history, tamrank_dashboard_changes_panel and the redirects-table seams); removed dead AI-linking strings and chain helper code.

= 1.3.4 =
* Compliance: the free plugin now contains only the free feature set — all add-on-only implementation (code, assets and extension scaffolding) lives entirely in the separate TamRank PRO add-on.
* Internal: renamed internal extension hooks to generic names, and removed an unused database table and dead helper code.

= 1.3.3 =
* Branding: the "Pro" badge in the admin footer now only appears when the PRO add-on is active.
* Cleanup: the free plugin no longer creates the Topical Authority and Change Tracker database tables — those are PRO-only features, and the PRO add-on now provisions its own tables.
* Hardening: the Topical Authority graph tooltip renders node labels as plain text, and the Search Console date-range whitelist is derived from the same list that builds the dropdown.
* Housekeeping: corrected the SEO Audit feature-tier label, restored the NL/DE/FR labels for 307/410 redirect types, and removed unused index-status API helpers.

= 1.3.2 =
* 404 Monitor: lists broken URLs with hit count and date, plus one-click redirect creation and CSV export.
* Settings: hardened how settings are stored so each settings group only saves its own known fields. Fixed the LLMS.txt "generation mode" option that could silently reset to Automatic when Manual or AI was selected.
* Privacy: the 404 log no longer stores visitor IP addresses or user-agents (they were never shown anywhere); it now keeps only the broken URL and the timestamp.
* Hardening: schema detection can no longer be triggered by anonymous front-end requests, custom JSON-LD is validated before it is saved, and a redundant unauthenticated write in the Search Console callback was removed.

= 1.3.1 =
* SEO Audit: the "Most Common Issues" summary now counts the same pages as the audit table. Pages excluded from the audit (set to noindex, or manually excluded) were being reported as missing a meta title, description or focus keyword even though they were hidden from the list below. The dashboard SEO counters, improvement tasks and task lists now apply the same exclusions, so every count and list on the audit and dashboard screens is consistent.
* SEO Audit: fixed the audit summary sometimes staying stuck on old numbers after you fixed pages and re-ran the scan. The "Most Common Issues" panel now reflects the live state on every page load, and the cached audit totals are written reliably on all database configurations (previously the cached summary could fail to update on databases that do not use the utf8mb4 character set).

= 1.3.0 =
* 404 monitor: the 404 log is now cleaned up automatically. Entries that have not been visited for 90 days are removed, and a hard cap (5,000 rows) prevents the table from growing without bound on sites with heavy bot traffic. URLs that are still being hit keep a fresh timestamp and stay in the list, so only "dead" 404s age out. The 404 Monitor screen states the retention window; both the window and the cap are filterable (`tamrank_404_retention_days`, `tamrank_404_max_rows`).
* Maintenance: corrected the scheduled-event cleanup on uninstall so all current cron events (including the indexing and notification events) are removed cleanly. Audit statistics options are no longer autoloaded on every request. Minor internal consolidation of how the API key is read. No changes to stored data and no database migration.

= 1.2.8 =
* Schema: extra schema types suggested for a page (such as HowTo and FAQ) are now only shown as active when they can actually be generated from the page content, so the badges in the editor always match the JSON-LD output. Previously a "HowTo" badge could appear for a "how to" titled page that had no step content.

= 1.2.7 =
* Content analysis: pages whose content is spread across multiple top-level sections (custom themes, full-site-editing/block themes, page builders like Divi) are now read in full instead of only the first section — headings, internal links and images are all detected correctly. Standard single-container themes are unchanged.
* Content analysis: fixed Elementor pages being under-read because the `elementor-widget` wrapper was mistaken for a sidebar widget and stripped.

= 1.2.6 =
* Editor: the floating "View full analysis" button now works from the block editor's code view — it switches back to the visual editor first, so the SEO meta box is actually visible instead of scrolling to a collapsed, empty area.

= 1.2.5 =
* Privacy: the admin font is now fully self-hosted — removed the remote Google Fonts request (the font was already bundled locally, so there is no visual change).
* Privacy: expanded the "External services" disclosure — Google Search Console traffic is proxied through TamRank's API, and the automatic-indexing endpoint is now documented.
* Public output: removed the tamrank.com link from the XML sitemap comment and the llms.txt footer.
* Admin: the WebP "not supported" notice is now dismissible and only appears on TamRank's own screens instead of every admin page.
* i18n: normalized all admin and REST strings to English source text with NL/DE/FR translations (including correct singular/plural handling), so the interface no longer shows stray Dutch on English, German or French sites.
* Housekeeping: normalized the license header to "GPLv2 or later" and resolved Plugin Check code-quality notices.

= 1.2.4 =
* UI: the confirm dialog's primary button now uses the brand green instead of dark navy, matching the rest of the plugin (destructive confirmations stay red).
* UI: the Test-a-URL field on the Schema page no longer shows a dark border — it uses the light plugin border like other inputs (WordPress' default input border was overriding it).

= 1.2.3 =
* Dashboard: the SEO-score gauge now uses the same colour scale as the rest of the plugin — a score of 60-79 shows teal ("Good") instead of amber, matching the SEO Audit page and the per-category badges.

= 1.2.2 =
* Schema: FAQ pages now actually output FAQPage JSON-LD (the question/answer pairs), not just the detection badge. The builder reads HTML5 `<details>`/`<summary>` accordions and definition lists, and now fetches rendered content on block/custom themes so FAQs rendered by the theme template are picked up.
* Schema: fixed the colour of the extra-schema badges in the post editor — they used an off-brand blue and now use the consistent brand green.
* Editor: fixed cache-busting for the schema editor script — it was pinned to a stale version, so browsers kept serving an outdated cached copy after plugin updates.

= 1.2.1 =
* Schema: automatic FAQ detection now recognises accordion-style FAQ pages — HTML5 `<details>`/`<summary>`, definition lists (`<dt>`) and `FAQPage` microdata — so an FAQ page no longer falls back to a plain WebPage. Works across themes, including custom and block themes.
* Schema: the page-content analyser used for detection now falls back to a cleaned `<body>` extraction when a theme uses its own content-container class names, so detection reaches content that standard selectors miss.

= 1.2.0 =
* Architecture: separated PRO features into a dedicated add-on, leaving the free plugin leaner and self-contained. The free plugin runs fully on its own; PRO features activate automatically when the add-on is installed.
* Security: hardened structured-data (JSON-LD) output so values can never break out of the script tag — `<`, `>` and `&` are now escaped in all schema output.
* Security: added defence-in-depth hardening to the 404 CSV export (spreadsheet formula-injection), the Search Console connect callback and schema template storage.
* Cleanup: removed leftover debug logging from the meta box.

= 1.1.28 =
* Scoring: the SEO score on the dashboard, the audit page and the per-post meta box now read from a single stored source (`_tam_rank_audit_score`), so they can no longer disagree. The total is 30% meta + 70% content (or 100% meta when no content score exists), with the same noindex/excluded-post filtering applied everywhere.
* Dashboard: the headline statistics no longer lag behind — recalculating stats now clears the cached dashboard data immediately.
* Dashboard: schema coverage now credits auto-detected post types, so custom post types and template-less sites are no longer scored at 0% coverage.
* Dashboard: schema scoring is now entity-type aware — in Custom mode it scores your custom JSON-LD instead of incorrectly deducting points for "missing" structured fields.
* SEO audit: fixed the scan progress bar getting stuck on "0 / 0" after an interrupted scan left a stale lock behind. A heartbeat now detects and clears dead scan locks automatically.
* SEO audit: fixed the CSV export and the "Generate report" button both failing with a "Network error".
* SEO report: rebuilt the HTML report with a cleaner, print- and PDF-ready design — dark cover page, executive summary with an overall score and three dimension bars, numbered sections, a score-distribution bar, prioritised findings and a "pages with the most room to improve" table. A "Print / Save as PDF" button and the report date are included. Brought fully onto the current TamRank brand (Plus Jakarta Sans, brand green, status palette).
* SEO audit: redesigned the exclusion panel — compact taxonomy grid, clearer sections, deduplicated taxonomy labels by post type, branded green-filled checkboxes and a Cancel button in the footer.
* Dashboard: priority badges no longer show a stray grey pill background on Medium/Low.
* License: retired the standalone license page in favour of a License tab in Settings that explains what the free version includes and how PRO works. Upgrade calls-to-action open tamrank.com.
* i18n: translated the SEO audit header strings (average score, most common issues, score labels) and the new report strings into NL/DE/FR.
* Compatibility: tested up to WordPress 7.0.
* Fix: resolved a PHP 8 `strip_tags(null)` deprecation notice on hidden admin sub-pages (onboarding and license).

= 1.1.27 =
* Topical Authority: Content Plan rows are now clickable — clicking any topic opens a new WordPress post draft with the topic pre-filled as the title (`post-new.php?post_type=post&post_title=…`). On hover, a brand-green chevron slides in from the right to signal the row is actionable. Works in both Content Plan (blueprint) and Gaps mode.
* Topical Authority: fixed a JS-render regression where re-running an analysis lost the blueprint-mode styling — gap chips now correctly switch between "Start hier / Fase 2 / Fase 3" (blueprint, primary/info/slate dots) and "High / Medium / Low" (analysis, error/warning/primary dots), matching the PHP-rendered output.
* Meta: consolidated duplicate focus-keyword storage. `_tamrank_focus_keyword` (legacy, written by the keywords class) and `_tam_rank_focus_keyword` (canonical, read by 37+ other classes) could diverge so that the dashboard and audit score showed stale data while the content analyzer and REST endpoint saw fresh data. Database schema bumped to 1.5.0 with a one-shot migration that merges legacy values into canonical and removes the legacy rows.
* Uninstall: opt-in "Delete all data" now also cleans up `wp_usermeta` rows with `tam_rank_*` / `tamrank_*` prefix (e.g. the per-admin 404-monitor last-seen timestamp). Previously these survived a full-data uninstall.
* i18n: new `start_writing_topic` key in NL/DE/FR for the Topical Authority click aria-label.
* Indexing: when the connected Google Search Console property doesn't match the current site, TamRank now shows a clear branded warning banner above the post list and stops trying to fetch index status (which would silently fail for the wrong property). The Index column shows a plain "—" with an explanatory tooltip instead of endless skeletons or per-row errors, and any stale in-progress index batch is cleared automatically.
* Indexing: auto-indexing on publish/update, the cron callback, and the per-row "Request indexing" button are all now blocked when the GSC property mismatches, so no Search Console API calls are wasted and the manual button returns a clear message.
* i18n: new `idx_mismatch_no_data` key and rephrased `idx_wrong_property_desc` in NL/DE/FR for the mismatch banner and tooltip copy.

= 1.1.26 =
* Topical Authority: page-selection list now exposes the full site instead of silently capping at 150 — users with 300+ posts can see and curate older content. Selection cap stays at 150, communicated up-front via an always-visible info banner and an "X / 150" counter (was "X / site-total"). When over cap, the counter turns amber, credits estimate dims, and the start-button disables.
* Topical Authority: new type-filter pill-group above the list (auto-hidden when the site has only one post type). Single-select, per-type counts, select-all / deselect-all are filter-aware so they only affect visible items.
* Topical Authority: visual polish — custom green-filled checkboxes (matches the onboarding wizard, bypasses WP-admin's blue accent-color skin), list titles in slate instead of bright primary-green, type badges sit inline next to titles instead of floating to the far-right edge, compacter row height shows ~30% more items per viewport, secondary "Select all / Deselect all" links muted by default with green only on hover.
* Topical Authority: deduplicated the credits display (was shown twice, both next to the counter and next to the start-button). Single credits indicator now lives next to the start-button as a checkout-style summary, with an info-tooltip explaining the higher credit cost: this feature uses a heavier AI model for the more complex task.
* i18n: `audit-page.php` no longer falls back to English "380 of 380 total" when the plugin language is NL/DE/FR — consolidated onto the existing translated key.
* i18n: WP core's `human_time_diff()` calls (e.g. "2 months ago" in the audit-page scan banner) now respect the TamRank plugin language via a new `tamrank_human_time_diff()` wrapper, instead of the WP locale which may diverge.
* Design system: migrated 24 remaining native `title=""` attributes across 8 files to the canonical `data-tr-tooltip` component for consistent dark-slate tooltips with ESC dismissal and keyboard support. Three hardcoded English strings near the sweep ("Accept", "Skip", "Confidence:") routed through the i18n catalogue.
* i18n: 6 new keys in NL/DE/FR (`dismiss`, `confidence_label`, `max_pages_notice_title`, `max_pages_notice_desc`, `filter_all`, `credits_higher_explanation`).

= 1.1.25 =
* Onboarding: render the admin email in the consent label in TamRank green so it visually echoes the green checkbox.

= 1.1.24 =
* Onboarding polish: custom green checkbox in the opt-in row (replaces the browser-default blue accent that WP-admin and Safari both refused to skin via `accent-color`). Email address in the consent label now stays in brand-slate instead of inheriting WP-admin's blue `<strong>` colour. Persona divider switched from dashed to a hairline solid line for a cleaner break.

= 1.1.23 =
* Onboarding: redesigned the email-tips opt-in card with a calmer slate + green palette (away from the bright amber), added an "Optional" chip and a progressive persona-detection step that reveals 4 radio cards only after the user opts in. Persona track (A/B/C/D) is forwarded to the email backend so subsequent setup-tip emails can be tailored. Disclaimer rewritten to be more honest: "5 emails over 14 days, then silence. One-click unsubscribe in every email."

= 1.1.22 =
* Onboarding: actually hide the step progress bar on the final "Done" screen — the 1.1.21 fix set `hidden=true` but the `display:flex` rule on the stepper overrode the UA `[hidden]{display:none}` due to source-order. Added a scoped `.tamrank-wizard__stepper[hidden]` CSS rule that wins.

= 1.1.21 =
* Onboarding: hide the step progress bar on the final "Done" screen so the success content (and the Go-to-Dashboard button) sits above the fold on smaller screens.

= 1.1.20 =
* Onboarding: optional email-tips opt-in on the wizard success screen. Default-unchecked checkbox sends an explicit consent signal; opt-in is stored locally and synced to api.tamrank.com once available. No emails are sent without active consent. See the new "External services" section for full disclosure.

= 1.1.19 =
* Fix: `og:type` meta tag now respects post type — only blog posts get `article`, pages and the homepage get `website`. Brings the OG output in line with the JSON-LD `@type:"WebPage"` schema.

= 1.1.13 =
* Safety: uninstall now preserves user data by default — license key, settings, audit scores, focus keywords, schema configs and custom tables are kept unless the "Delete all data on uninstall" toggle is explicitly enabled. Previously, options and post meta were always wiped on plugin delete; only custom tables were opt-in.
* Safety: add `tam_rank_404_log` to the opt-in DROP list so the cleanup is consistent across all custom tables.

= 1.1.11 =
* Security: add uninstall.php with opt-in full data cleanup (wp.org / GDPR compliance).
* Security: harden API key storage — password input, autoload=no, consistent masking.
* Security: apply rate limiter to AJAX AI endpoints (5 buckets, per-user).
* Security: defensive output escaping in schema UI.
* Performance: request-scope option cache for hot settings.
* i18n: generate languages/tam-rank.pot.
* UX: merge SEO Data Migration and Setup Wizard cards; move Privacy & Data toggle to Import/Export tab.
* Compliance: remove invalid `Network: false` plugin header field.

= 1.1.10 =
* Onboarding wizard polish: stepper labels, warmer copy, branded welcome icon, empty-state fallback.

= Earlier versions =
See the changelog entries above for the release history.

== Upgrade Notice ==

= 1.3.3 =
The footer "Pro" badge is now hidden in the free plugin, PRO-only database tables are no longer created by the free plugin, plus minor hardening. No breaking changes.

= 1.3.0 =
Full multilingual interface (English source with NL/DE/FR translations), automatic 404-log cleanup, a leaner free plugin and an accurate readme. No breaking changes. Recommended update.

= 1.2.5 =
Self-hosted admin font (no external Google Fonts request), fuller External services disclosure, no more tamrank.com link in the sitemap/llms.txt output, a dismissible WebP notice, and a full English-source i18n pass (NL/DE/FR). No breaking changes. Recommended update.

= 1.1.28 =
The SEO score is now consistent across the dashboard, audit and meta box, the audit progress bar and report/CSV exports are fixed, and the HTML report has a clean print/PDF-ready redesign. Tested up to WordPress 7.0. Recommended update.

= 1.1.27 =
Clickable Content Plan rows, a one-time focus-keyword consolidation (database upgrade to 1.5.0), cleaner uninstall, and clearer handling when a mismatched Google Search Console property is connected. Recommended update.

= 1.1.13 =
Important safety fix: the previous uninstall behaviour wiped user data on plugin delete even when the opt-in toggle was off. This release respects the toggle for all data tiers. Strongly recommended for anyone with audit data or custom configurations.

= 1.1.11 =
Security and performance improvements plus launch hardening for wp.org submission. No breaking changes.
