Coretex SEO v3

Description

Coretex SEO is not another SEO plugin. It is an operating system for your WordPress site’s search presence — continuously analysing your content, surfacing structured recommendations across every SEO surface, and applying approved changes automatically.

“SEO Automation Built for Modern WordPress Teams”

Coretex SEO AI Automation handles the heavy lifting: scanning every page, generating optimizations, and queuing them for your approval. You stay in control. The AI does the work.

What Coretex SEO analyses and improves:
* SEO title tags — rewritten for maximum click-through
* Meta descriptions — compelling, keyword-aligned summaries
* Internal link structure — connecting isolated pages
* Heading hierarchy — proper topic structure throughout
* GEO direct answers — content formatted for AI-generated responses
* JSON-LD schema — structured data for rich results
* E-E-A-T signals — authority and trust indicators
* Image title and alt text — accessibility and image search
* AI search visibility — brand presence in ChatGPT, Perplexity, Google AI

Version 2.4.0 — What’s new:
* Site Profile — teach Cortex your niche, audience, tone and core topics so every AI suggestion stays on-brand and on-topic
* Auto-learning — Cortex infers a Site Profile from your existing content on first scan if you don’t set one yourself
* React-powered admin dashboard (SaaS-style UI, zero page reloads)
* REST API backend for all dashboard operations
* Real-time queue with optimistic UI updates
* AI Visibility view with category heatmap
* Onboarding panel integrated into the Overview

AI SEO Workflows

Coretex SEO generates specific, actionable improvements for every page on your site — then holds them in a queue for your review. Every change requires your approval. Nothing goes live automatically.

Optimize for AI Search (GEO)

Generative Engine Optimization — structured to appear in AI-generated answers across ChatGPT, Perplexity, and Google AI Overviews. Your AI Search Score tells you exactly where you stand.

AI-Powered SEO Intelligence

Keyword research, competitor intelligence, SERP landscape analysis — all seeded with real data from DataForSEO and AI-estimated signals where real data isn’t available.

Human-Approved AI SEO

Every suggestion Coretex SEO generates requires your explicit approval before going live. The AI proposes. You decide. Your site changes only when you say so.

AI Providers Supported

OpenAI, Anthropic Claude, Google Gemini, Mistral, Groq, DeepSeek, xAI (Grok), Perplexity, OpenRouter, and Ollama (fully local/private) — bring your own API key for whichever you prefer

External Services

This plugin connects to a number of external services to provide its features. Every connection below is optional, requires you to configure it yourself (your own API key/account, or an explicit opt-in setting), and nothing is contacted automatically without that configuration. No connection is required to activate or use the plugin’s free-tier features (Title Scan, Meta Scan, Spelling Check, and the Approval Queue) beyond your chosen AI provider below.

AI Providers (required for AI-powered scans and the Approval Queue’s suggestions)
You must configure your own API key for at least one of the following, entered in Settings AI Engine. Whichever provider you choose, the specific content being scanned (e.g. a post’s title, or its text for a spelling check) is sent to that provider’s API to generate a suggestion. Nothing is sent to any provider unless you have entered a key for it and clicked a scan button.
* OpenAI (Terms, Privacy Policy)
* Anthropic (Terms, Privacy Policy)
* Google Gemini (Terms, Privacy Policy)
* Mistral AI (Terms, Privacy Policy)
* Groq (Terms, Privacy Policy)
* DeepSeek (Terms, Privacy Policy)
* xAI (Grok) (Terms, Privacy Policy)
* Perplexity (Terms, Privacy Policy)
* OpenRouter (Terms, Privacy Policy)
* Ollama — runs locally on your own server; no external service is contacted.

Google Search Console (optional — only if you connect it in the Rank & Backlinks tab)
Used to read your site’s search performance data and, if you use the sitemap-submission tool, to submit your sitemap URL. Requires you to sign in with your own Google account via OAuth. Google Terms of Service · Google Privacy Policy

DataForSEO (optional — only if you enter your own DataForSEO credentials)
Used for live keyword-ranking and backlink data on the Rank & Backlinks tab. DataForSEO Terms · DataForSEO Privacy Policy

IndexNow / Bing / Yandex (optional — only if you use the “Submit to IndexNow” tool)
Sends the URLs of your recently published/updated content to api.indexnow.org for instant indexing by participating search engines (Bing, Yandex). Bing Webmaster Terms · Microsoft Privacy Statement

Coretex SEO Licence Server (optional — only if you enter a paid Pro/Agency/Unlimited licence key)
If you purchase a paid plan, entering your licence key sends the key and your site’s domain to coretex-seo.co.uk to verify your plan and unlock the corresponding features locally in the plugin. The free tier of this plugin works fully without ever entering a licence key or contacting this server. Coretex SEO Terms & Privacy

Installation

  1. Upload the cortex-seo-premium folder to /wp-content/plugins/
  2. Activate the plugin through the WordPress Plugins menu
  3. Navigate to Coretex SEO Overview in your admin dashboard
  4. Connect your AI provider API key in Settings AI Engine
  5. Run your first scan from Optimize Site Scans
  6. Review and approve recommendations in the Queue

FAQ

What’s included in the Free plan?

The Free plan is fully functional on its own, with no time limit and no licence key required: AI Engine connection to any supported provider, the Approval Queue, Title Scan, Meta Scan, Spelling Check, and Content Freshness Review, on 1 site. No Coretex SEO account or licence key is needed to use these — bring your own AI provider API key and go. Paid plans (Pro, Agency, Unlimited) unlock additional scans, the full SEO Audit, GEO tools, keyword research, the AI writer, and agency features like white-label client reports — see the in-plugin Settings page for the full comparison.

What is “Human-Approved AI SEO”?

Coretex SEO scans your content, generates improvements (better titles, stronger meta descriptions, structured data), and queues them for your review. You approve each change with one click. The AI writes — you approve — your site improves.

What is GEO / AI Search Optimization?

Generative Engine Optimization (GEO) means optimizing your content to appear in AI-generated answers — ChatGPT, Perplexity, Google AI Overviews. Coretex SEO’s GEO features analyse your site’s structural signals and generate improvements designed to increase AI citation likelihood.

Will Coretex SEO change my site automatically?

Never. Every suggestion appears in the approval queue with a before/after preview. Nothing is applied until you explicitly approve it.

Which AI provider should I use?

Any of the supported providers work — pick whichever you already have an account with. Ollama is available for a fully local, zero-cost setup that never leaves your own server. Check the AI Engine Settings page for each provider’s current recommended default model, since providers update their model lineups over time.

Can I use this for client sites?

Yes. White-label settings (Agency plan and above) let you customise client reports with your agency name, logo, and brand colour.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“Coretex SEO v3” is open source software. The following people have contributed to this plugin.

Contributors

Translate “Coretex SEO v3” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

3.2.4

  • CRITICAL FIX: the Interface Language selector saved correctly but never actually changed the displayed language — it stayed English regardless of selection. Root cause: load_plugin_textdomain() was called on the ‘plugins_loaded’ hook, which was the standard, correct pattern for years — but WordPress 6.7 (which this plugin already lists as tested up to) changed the requirement: translations must now be loaded on ‘init’ or later, and loading them on ‘plugins_loaded’ can silently fail to apply the selected language even though everything else (the saved option, the plugin_locale filter) is working correctly.
  • Moved translation loading to the ‘init’ hook at priority 1 (the officially documented fix), while everything else that was previously bundled into that same ‘plugins_loaded’ callback (constructing the dashboard and frontend classes) stays exactly where it was — verified neither of those does anything translation-dependent early enough for the reordering to matter.
  • Verified directly: confirmed the plugin_locale filter is registered well before ‘init’ fires (as it always was), and simulated the real WordPress hook firing order end-to-end (plugins_loaded, then init) to confirm a saved language selection now actually resolves correctly at the point translations are loaded.

3.2.3

  • Full codebase audit and cleanup pass — systematic checks across all 12,400+ lines, not a surface skim. Full results below.
  • SIGNIFICANT FIX: every success/error flash message across the entire plugin (dozens of them, built up over the whole project) has been rendering as a flat, uncoloured box — the CSS classes the notice-rendering code actually outputs (.cortex-notice-success, .cortex-notice-error) were never defined, only a same-purpose-but-unused .cortex-notice-info existed. A parallel, fully-styled but completely dead .cortex-flash set of classes existed alongside it, built for this exact purpose but never actually wired to the real rendering code. Fixed by folding the correct styling into the classes that are actually used, and removed the dead duplicate. Verified with an actual rendered image of all 3 notice types using the real class-naming pattern the PHP outputs.
  • Removed 5 confirmed-dead methods (defined, zero callers anywhere — verified via both direct-call and string-literal-reference search, since many methods are legitimately called only via WordPress hook callbacks): Cortex_SEO_Edition::is_pro_or_higher(), ::is_premium(), ::is_whitelabel(), ::feature_faq_inject() (a stub left over from the FAQ feature removed back in v2.4.0), Cortex_SEO_Dashboard::render_audit_images() (leftover from removing the Image Alt Text audit check earlier), Cortex_SEO_Competitor_Gap::importance_colour() (superseded by inline logic using the current design tokens), and Cortex_SEO_Connection::preflight_check() (built but never wired into any actual call site).
  • Investigated but correctly left alone: Cortex_SEO_Dashboard::render_tab_fragment() and the entire Cortex_SEO_Admin_API REST layer initially looked unused by a naive search, but are genuinely live — a real, hooked REST API (registered on rest_api_init) intended for a React-based admin UI that doesn’t ship its frontend bundle in this build yet. This is intentional unshipped infrastructure, not a bug; left fully intact.
  • Checked all $wpdb queries not using prepare() for SQL injection risk — none found; every case either uses only hardcoded literals (no user input reaches the query) or already uses prepare() correctly on a following line.
  • Confirmed nonce and capability checks correctly and centrally protect every POST action handler — one check gates the whole switch statement, no per-case gaps.
  • Checked for orphaned CSS, leftover debug statements (var_dump/print_r/error_log), and unused JS functions — none of concern beyond the notice-class issue above.

3.2.2

  • Fixed: GEO & AI Focus tab didn’t match the rest of the plugin’s design — the AI Citation Readiness Score card used a hardcoded 14px radius, no shadow, and 3 hardcoded hex colours instead of the design system’s tokens (every other tab uses .cortex-card + CSS variables). Now uses the same card styling as the rest of the plugin, including the checklist pass/warn/fail icon colours.
  • CRITICAL FIX: the Licence tab could show “invalid or not recognised” while every paid feature kept working correctly — because the box checked the raw ‘valid’ flag from the single most recent background check, while actual feature-gating (Cortex_SEO_Edition::current_tier()) reads the tier independently and doesn’t require that exact flag. If the most recent automatic recheck failed for an unrelated reason (a network hiccup, a rate limit) while the tier was still resolvable from the stored data, the two would disagree — same category of bug as the earlier stale-connection-status issue. The box now derives “valid” from the same source that actually gates functionality, so what it says and what actually works can no longer disagree. When this specific situation happens, a note now explains that the last automatic recheck didn’t succeed even though the plan is still active, with a prompt to click Recheck.
  • Verified the licence fix directly: simulated the exact reported scenario (stored status has valid=false from a failed recheck, but the tier itself still resolves and gates real features correctly) — confirmed the box now correctly shows “Active — Agency edition” instead of “Invalid”.

3.2.1

  • Changed: Technical Site Audit and Canonical & Noindex moved from Pro to Agency+ only, joining Full Site Analysis. Enforced both client-side (greyed button, no lock icon, “Requires Agency” badge) and server-side (can’t be bypassed by submitting the form directly).
  • Removed: Image Alt Text check taken out of the SEO Audit tab entirely — removed from the section grid, the results display, and the Full Site Analysis bundle.
  • Changed: on both the SEO Audit and Site Scans pages, available (unlocked) buttons now render grouped together first, with locked ones grouped together after — instead of a fixed order that mixed them throughout the grid.
  • Confirmed already correct, no change needed: AI Visibility & Recommendations (the AI-generated score) remains Agency+ only, and DF Page Categories was already present on Site Scans, Agency+ gated, from earlier work.
  • Verified directly: rendered the real Audit page HTML for a Pro-tier account and confirmed the actual button order (3 unlocked sections first, then the 3 newly-locked ones) and confirmed Image Alt Text no longer appears anywhere on the page.

3.2.0

  • Added: IndexNow integration and AI Crawler Allowlist check, on the AI Visibility tab, available from Pro upward. The tab now opens with an honest note explaining these are the real equivalent of “submitting to AI engines” — ChatGPT/Claude/Perplexity don’t offer a direct submission mechanism, but Bing (which powers Bing Chat/Copilot) does via IndexNow.
    • IndexNow: one click submits your most recently published/updated content for instant indexing by Bing and Yandex, instead of waiting for a crawl. Verified the actual request against the real IndexNow API spec (host/key/keyLocation/urlList) and all three response paths (success, key-not-found, empty list).
    • AI Crawler Allowlist: checks robots.txt for 10 known AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, and others) being accidentally blocked, with a one-click fix.
  • Fixed a real bug caught during testing: the AI Crawler Allowlist fix was only appending a new “Allow” rule without removing an existing conflicting “Disallow” rule for the same bot elsewhere in the file — robots.txt doesn’t reliably resolve that conflict in the crawler’s favour. Now removes any existing rule block for each of the 10 known bots before adding the clean Allow rule, verified directly with a before/after test including a mixed case (one bot fully blocked, another partially restricted) to confirm unrelated rules are left untouched.
  • Fixed 2 stale upgrade-notice messages that said “requires the Pro edition” for features actually gated to Agency, left over from an earlier tier change.
  • Tier structure: the AI Visibility Score & Recommendations (the AI-generated analysis) stays Agency+ only, unchanged from the earlier explicit decision — only the two new tools above are Pro+.

3.1.0

  • Added: Robots.txt & Sitemap Submission section on the Site Scans page — available on every plan (Free, Pro, Agency, Unlimited), not tier-gated.
    • Robots.txt editor uses WordPress’s own ‘robots_txt’ filter (the same safe approach every major SEO plugin uses) rather than writing a physical file, so it works on every host regardless of filesystem permissions.
    • Built-in safety check refuses to save (with a clear explanation) if the content would block every search engine from the entire site — verified against both a genuinely dangerous case and normal/specific-path Disallow rules to confirm no false positives.
    • One-click sitemap submission to Google Search Console (real Sitemaps API call) for anyone who has GSC connected. Automatically uses Cortex’s own richer sitemap on Agency/Unlimited, or falls back to WordPress’s own built-in sitemap on Free/Pro — so submission genuinely works on every tier, not just where Cortex’s sitemap feature is unlocked. Verified this branching directly.

3.0.6

  • Changed: “Scan Posts” page renamed to “Site Scans”.
  • Changed: Spelling Check (AI) moved to the first position in the scan list, above Page Titles.

3.0.5

  • Changed: default “Posts per scan” batch size raised from 5 to 50 for Pro, Agency, and Unlimited. Free stays hard-locked at 5 — the field is now genuinely disabled (not just capped) on Free, and the server independently ignores any submitted value and forces it back to 5, so it can’t be bypassed by tampering with the request.
  • Fixed: batch_cap() (the tier-based limit) already existed in the code but wasn’t actually being enforced anywhere — every real read/save site used a flat hardcoded 5/50 regardless of tier. Now wired into every scan-execution site, both display locations, the save handler, and the input field itself.
  • Fixed: the batch-size option was being pre-created with a hardcoded 5 at plugin activation, which would have silently frozen a Free-tier install at 5 forever even after upgrading to Pro (since a stored option value always beats a fallback default). Removed — the correct tier-aware default is now always computed live.
  • Verified directly across all 4 tiers: correct default value, correct enforced cap, and confirmed a simulated attempt to submit 999 on Free is correctly forced back to 5 rather than accepted.

3.0.4

  • Clarified: the “Posts per scan” help text now explains that the batch counts blog posts and pages together, not one or the other — and flags the one exception (DF Page Categories, which is pages-only).

3.0.3

  • Changed: Rank & Backlinks tab moved from Agency+ to Pro+ — now available on Pro, Agency, and Unlimited (previously Agency/Unlimited only). This is a single gate in Cortex_SEO_Edition, so it automatically updates the tab bar, the WP admin sidebar, and every locked-button state consistently.
  • Verified the new gate resolves correctly across all 4 tiers directly (Free: locked, Pro/Agency/Unlimited: unlocked).

3.0.2

  • Added: the green status dot in the “OPERATIONAL” and “AI Connected” pills now slowly fades in and out on a loop (2.2s), signalling an active/live connection. Only applies to the connected/green states — warning and error dots stay static, so a problem never looks like it’s “pulsing along nicely”. Respects the OS-level “reduce motion” accessibility setting.

3.0.1

  • Fixed: the “Apply” button (and any other button rendered as a link, e.g. in the Approval Queue) showed purple text instead of white — a CSS specificity bug where the general “all links are purple” rule narrowly beat the button’s own white-text rule. Fixed by excluding buttons from the general link-colour rule at the source, rather than patching individual button classes. Verified with an actual rendered image of the exact button markup before/after.

3.0.0

  • Rebranded: plugin renamed from “Cortex SEO — Premium” to “Coretex SEO v3”, correcting a spelling inconsistency that had run through the whole plugin — every user-facing “Cortex SEO” text (62 occurrences across 21 files: admin menu/page titles, notices, help text, client report headers/footer, licence messages, email reports) is now “Coretex SEO”, matching the actual brand name shown in the logo and used on coretex-seo.co.uk.
  • Fixed: Plugin URI was pointing at an unrelated domain (cortexseo.ai) — corrected to coretex-seo.co.uk.
  • Dropped “Premium” from the display name and remaining mentions to match the new v3 branding.
  • Scope note: internal PHP class names (Cortex_SEO_), constants (CORTEX_SEO_), database option keys (cortex_seo_*), the plugin’s text domain (cortex-seo), and its folder/slug were deliberately left unchanged — renaming those would risk breaking your live site’s saved settings, license activation, and the 10 language translation files (which are keyed to the text domain) for no user-visible benefit, since none of those are ever seen by anyone using the plugin.

2.13.0

  • Client Report completely rebuilt — fixed a genuine “Executive Summary” heading printed twice in a row, and removed a fake bar chart made of hardcoded random numbers ([35,62,48,75,…]) that had no connection to any real data and was actively misleading in a client-facing deliverable.
  • Removed two fabricated metrics presented as if they were real measured data: “Visibility Score %” (was just audit score minus an arbitrary offset) and “Keyword Growth +N” (was keyword count × 3, not real growth tracking). The Executive Summary now shows only genuinely computed numbers: SEO Audit Score, Avg Content Score, Pages Scored, Keyword Opportunities, Critical Issues, and Link Building Opportunities.
  • Redesigned to match the plugin’s own admin design system — same navy/purple palette, Inter typeface, card/radius/shadow language — instead of a separate, disconnected visual style. The agency’s own white-label brand colour is still respected as the accent throughout (this report’s white-labelling is for agencies delivering to their own clients).
  • Proper A4 sizing: the report now renders as an actual 210mm-wide page (both on screen and via @page print rules), instead of an unbounded-width layout that didn’t correspond to any real paper size.
  • Fixed the summary stat layout from CSS Grid to flexbox for far broader rendering compatibility — verified via an actual rendered image test that CSS Grid silently collapsed to a single column in one real-world PDF rendering engine (relevant since agencies commonly use automated HTML-to-PDF tools, not just live browser printing); flexbox renders correctly across both.
  • Verified all of the above by actually executing the report generator with realistic data and rendering the real HTML output to an image for direct visual inspection — not just reviewing the code.

2.12.5

  • Changed: the “Send report to (email)” field on AI Engine Settings no longer pre-fills your WordPress admin email as real text before you’ve typed anything — it now starts blank, with the admin email shown only as a greyed placeholder hint. Saving/sending still safely falls back to your admin email if left blank (verified directly), so scheduled audit emails can’t silently fail to send.

2.12.4

  • Fixed: the Overview page’s lifecycle progress rings (Initiation/Planning/Execution/Supervision/Closure) were broken by a CSS class-name collision introduced during the redesign — .cortex-ring was reused for both the large donut-chart stat rings and the tiny 8px header status dot, so the dot’s styling won. Split into two separate rules; rings are now a proper 92px donut chart (up from the broken ~8px), significantly bigger per request.
  • Fixed: the 5 ring colour variables (–cortex-blue, –cortex-orange, –cortex-green, –cortex-red, –cortex-purp) were never carried over into the redesigned token system, so the progress arcs had no valid colour at all. Added all 5, matched to the new palette.
  • Improved: stat cards now centre their content properly (ring above, label below) with consistent spacing and a subtle hover lift, instead of the cramped left-aligned layout.
  • Verified with an actual rendered simulation of the fixed component (not just the CSS) before considering this done — confirmed correct arc proportions, colours, and centred large text for all 5 values.

2.12.3

  • Fixed: a real contrast bug in the redesigned header — the logo’s “CORE” text is dark navy, and the header background from the redesign was also dark navy, making it nearly invisible (exactly the “text blending into background” problem to avoid). Verified by compositing the actual logo file against the actual header gradient before and after. Changed the header to a light background (white to pale purple) that the logo — clearly designed for a light background — now displays against with full legibility for both colors in the wordmark.
  • Adjusted the status pills (system status + AI connection status) to match the new light header: white pill background with navy text and a subtle border/shadow, replacing the white-text-on-transparent-dark styling that no longer applied.
  • Logo image files themselves are unchanged (confirmed via file timestamps) — this was purely a background-color fix, not a logo replacement.

2.12.2

  • CRITICAL FIX: the status box on Settings showed a stale, misleading provider/model whenever you switched providers — e.g. after saving Groq, it kept displaying “OPENAI · gpt-4o-mini” (your previous provider’s last test result) even though the state label correctly said “Not tested”. The detail text was pulling from the last stored test result regardless of whether it still matched the currently active provider. Now it only shows that stored result for “Connected”/”Failed” states (where it’s guaranteed relevant); for “Not tested” it shows the actual currently-saved provider and model instead.
  • Verified with a direct simulation of the exact reported scenario (Groq saved as active, stale OpenAI test result still in storage) — confirmed the box now correctly reads “GROQ · [model] — click Test Connection to verify” instead of the old provider’s stale data.

2.12.1

  • Added: an “unsaved changes” warning that appears directly under the Brain dropdown the moment you change it, before saving. Test Connection always tests whatever is actually saved in the database — not whatever’s currently showing in the dropdown — so changing the dropdown without clicking Save Settings first (then testing) looked like a broken connection when it was really just an unsaved selection. This makes that trap impossible to miss.

2.12.0

  • Complete visual redesign — the entire admin.css was rewritten from scratch as one cohesive design system (down from 1,422 lines of overlapping/conflicting theme layers to 702 clean, organized lines), instead of patching individual sections.
  • New premium tech aesthetic built around the actual Cortex logo’s navy/purple palette: deep indigo header with a subtle radial-gradient glow, soft cool-grey page background, purple accent buttons, consistent card/button/input/table/badge styling throughout every tab.
  • Added Inter (a modern, professional typeface used across leading SaaS/tech products) via Google Fonts, with a full system-font fallback chain.
  • Removed every lock icon (🔒) from the interface — restricted features and buttons are now shown simply greyed out with a dashed border and muted “Requires X” text badge, no lock symbols anywhere, per explicit design direction.
  • Fixed a real contrast failure caught while auditing the new design: the greyed-out/disabled button text only had a 2.58:1 contrast ratio against its background (fails WCAG AA’s 4.5:1 minimum) — darkened to 4.58:1. Spot-checked every other core text/background pairing (headings, buttons, badges) — all pass AA comfortably (5:1–15:1).
  • Confirmed the logo assets are unchanged/correct (same source files as the previous logo update) — displayed at their native, undistorted proportions in the header and footer.
  • Fully responsive — added explicit tablet (960px) and mobile (600px) breakpoints so grids, tables, and the header stack sensibly on small screens.

2.11.1

  • Changed: Advanced GEO scans (Direct Answer Summaries, JSON-LD Structured Data, E-E-A-T Improvements), DF Page Categories, Category Assignment, URL Slug Optimizer, Open Graph/Social Meta, and Content Freshness Review all moved from Pro to Agency+ only.
  • Changed: AI Visibility & Recommendations moved from Pro to Agency+ only.
  • Fixed: the GEO & AI tab had its own duplicate “Citation Layer Analysis” buttons for the three Advanced GEO scans that were never actually tier-gated in the UI — they looked live and clickable at Pro tier but silently failed server-side. Now shows the same greyed-out/locked treatment as the Scans page.
  • Fixed: “Run Full Analysis” on the SEO Audit tab had no tier check at all, client or server-side — any Pro-tier user could actually run it. Added the missing server-side gate (not just a UI lock) and the matching locked/greyed button.
  • Verified the new tier boundaries directly across all 4 tiers (Free/Pro/Agency/Unlimited) — confirmed exactly the intended scans/features unlock at Agency, nothing changes at Free/Pro beyond the removals, and Agency/Unlimited get everything.

2.11.0

  • Added: multi-language system for the plugin’s own admin interface. New “🌐 Interface Language” selector at the top of Settings, supporting English, Spanish, French, German, Italian, Portuguese, Dutch, Polish, Chinese (Simplified), Japanese, and Arabic, plus a “Site Default” option that follows WordPress’s own language setting (the default — nothing changes for anyone who doesn’t touch it).
  • Added: real WordPress i18n infrastructure — a genuine .pot template (1,114 strings, extracted from the actual codebase via xgettext), 10 compiled .po/.mo translation file pairs, and a new Cortex_SEO_I18n class that overrides WordPress’s site language for this plugin’s text domain only, via the standard ‘plugin_locale’ filter — every other plugin and WP core is completely unaffected (verified directly, including a specific WooCommerce isolation test).
  • Fixed 2 hardcoded, untranslatable strings found while auditing the codebase for this: tier names (Free/Pro/Agency/Unlimited) were PHP class constants, which can’t call __(); converted to a runtime method so they translate correctly.
  • Translation coverage: ~34 of 1,114 strings are translated per language currently — the highest-visibility ones (navigation, primary buttons, tier names, key headings). Everything else falls back to English automatically (standard gettext behaviour) until translated further — see languages/README.md for the full workflow to add more.
  • Verified end-to-end: the plugin_locale filter correctly overrides only the cortex-seo domain (confirmed via direct simulation, including proof of zero effect on other plugins/WooCommerce), and all 10 compiled .mo files were verified at the binary level (a custom .mo parser confirmed real translated strings decode correctly, e.g. “Overview” “概要” in Japanese, “نظرة عامة” in Arabic).

2.10.3

  • CRITICAL FIX: licence verification was calling the wrong REST endpoint entirely. The plugin was requesting https://coretex-seo.co.uk/wp-json/coretex/v1/license/verify, but the actual “Coretex License Bridge for WooCommerce” plugin registers https://coretex-seo.co.uk/wp-json/coretex-licensing/v1/verify — a completely different namespace and path. This is what produced the “No route was found” 404. Fixed by pointing at the correct endpoint, confirmed directly against the bridge plugin’s source code.
  • CRITICAL FIX: even with a working connection, the tier would never have been detected correctly — the licence bridge returns the tier as ‘tier’ (and ‘plan’ as a duplicate), but the plugin only ever checked for a field called ‘edition’, which the bridge never sends. Every successful verification would have silently fallen back to Free. Now checks ‘tier’, then ‘plan’, then ‘edition’ in order.
  • Verified end-to-end with the bridge plugin’s exact real response shape (copied from its source): confirmed a valid Agency-tier response now correctly unlocks Agency-gated features, and a “key not found” response correctly and safely falls back to Free.

2.10.2

  • Fixed: saving or rechecking a licence key showed a generic “could not be verified” message at the top of the page, even though the plugin already knew the specific reason (domain mismatch, licence server’s own error text, HTTP status, or a connection failure) — that detail only appeared in a separate diagnostics panel further down the page. The top-of-page message now shows the real reason directly, e.g. “Licence server rejected the request (HTTP 403) for domain ‘example.com’. If your licence was issued for a different domain…” instead of a dead-end generic message.
  • Verified with 5 direct test scenarios (network failure, licence-server error message, HTTP error with no message, malformed non-JSON response, and a fully empty result) — each produces the correct specific message, with a safe generic fallback only when truly no detail is available.

2.10.1

  • Changed: locked features are now visible-but-locked everywhere, instead of a mix of “hidden entirely” and “clickable but silently fails”. Specifically:
    • Site Scans: locked scan types (e.g. Pro/Agency scans on a Free site) now show as greyed-out, dashed-border buttons with a 🔒 and “Requires Pro/Agency” badge, linking to the pricing page — previously they looked identical to unlocked scans but failed with a confusing “Unknown scan type” error when clicked.
    • WP admin sidebar: locked tabs (Audit, GEO, AI Visibility, Keywords, Competitors, Rank & Backlinks, AI Writer, Client Report) now show a 🔒 in the menu label and render dimmed in the sidebar, still clickable through to that tab’s upgrade notice.
    • In-page tab bar: the Rank & Backlinks tab shows the same dimmed + 🔒 treatment when locked.
  • Fixed: .cortex-upgrade-notice (the “requires the X edition” box shown on locked tabs) had no CSS defined at all — was rendering as an unstyled plain box. Now styled consistently with the new locked-state design.
  • This is tier-agnostic by design: a Free-tier site sees everything above Free locked; a Pro-tier site sees Agency+ locked; Agency sees nothing locked (all current features); the same mechanism drives every tier automatically from Cortex_SEO_Edition — no per-tier special-casing needed.
  • Verified the locked/unlocked scan split is exactly correct at all 4 tiers via direct testing.

2.10.0

  • Added: real 4-tier licensing (Free / Pro / Agency / Unlimited), matching coretex-seo.co.uk’s pricing page. Previously every install had full access regardless of licence — this is now properly gated.
  • Free: AI Engine (all 10 providers), Approval queue, Title Scan, Meta Scan, Spelling Check, Content Freshness Review, 1 site.
  • Pro (+Free): remaining on-page scans (link, headings, images, categories, slug, Open Graph), SEO Audit (6 tools), GEO Checklist, AI Visibility, Keyword Research, AI Writer, 3 sites.
  • Agency (+Pro): Advanced GEO scans, Competitor Gap Analysis, Backlink monitoring, Rank & Backlinks (GSC + DataForSEO), SERP analysis, Full Site Engine, branded Client Reports, Scheduled scans, Bulk approval, White-label, Sitemap Manager, 10 sites.
  • Unlimited (+Agency): unlimited sites, largest batch sizes.
  • Tier comes from the licence server’s response; no licence, an invalid licence, or an unrecognised edition string all safely fall back to Free rather than granting or blocking everything.
  • Every previously-unlocked tab/action now shows a real upgrade notice naming the correct tier instead of a generic “Premium” message, with a link to the pricing page.
  • Note: site-count limits (1/3/10/unlimited) are informational only — enforcing how many sites share one licence key has to happen on the licence server, not inside a single plugin install.
  • Note: the pricing page’s own Agency site-limit is inconsistent (pricing table says 10, FAQ says “up to 50”) — flagged in-plugin; the site owner should reconcile this.
  • Verified with a direct end-to-end test across all 4 tiers plus edge cases (unrecognised edition string, no licence at all) — confirmed safe fallback to Free in every case, no crashes, no accidental full-access leaks.

2.9.12

  • Fixed: the header pill and Settings status box only updated when you clicked the dedicated “Test Connection” button — if a real scan or feature successfully used the AI provider without that button ever being clicked, the pill kept showing a stale “Failed” from whatever the last explicit test happened to be, even while AI was demonstrably working. Every real AI call anywhere in the plugin now updates the same status Test Connection does, so the pill reflects actual current reality.
  • Verified with a direct simulation: stale “Failed” status real successful scan call (no Test Connection click) pill correctly flips to “Connected”.

2.9.11

  • Reworked: AI Engine Settings page simplified, based on a comparison against a known-working simpler build. Removed the separate JS-injected “AI Diagnostics” panel (Provider/Model/State/Key source/etc.) — it was a second, independently-computed status source stacked on top of the page’s own reliable, always-accurate inline connection-status box, and the two could show inconsistent state. The page now has one single source of truth: the inline status box (✓ Connected / ✗ Failed / ⚠ No API key / — Not tested), which is rendered directly in PHP on every load, plus the exact error message shown after clicking Test Connection.
  • The header status pill (top-right “AI: Connected/Failed/Missing key”) is unchanged and still links straight to Settings.
  • Removed the now-dead server-side data injection that only fed the removed panel.

2.9.10

  • Fixed: the Settings-page AI Diagnostics panel was a static page-load snapshot — clicking “Test Connection” updated the header pill and the small feedback message, but the diagnostics panel itself stayed on stale “Not Tested / Never” data until a manual page reload. It now refreshes live with the real result immediately after every test.

2.9.9

  • CRITICAL FIX: the AI Engine Settings dropdown and Save/Connect flow were reading from a completely separate, never-updated model list (providers_map()) than the one earlier updates had fixed (model_info_data(), used only for the cosmetic info tooltip). This meant Settings was still offering and defaulting to dead models — gemini-1.5-flash, deepseek-chat, grok-2-latest, plus stale Anthropic/Mistral/Groq/Perplexity/OpenRouter lists — regardless of prior fixes, which is why AI Engine Settings would not connect.
  • Fixed: providers_map() now has the same corrected, verified-current model lists and defaults across all 10 providers (OpenAI, Anthropic, Gemini, Mistral, Groq, DeepSeek, xAI, Perplexity, OpenRouter, Ollama).
  • Verified with a direct simulation of the real save flow (POST cortex_seo_brain=… through to the saved model option) to confirm the fix resolves correctly, not just that the array is well-formed.

2.9.8

  • Fixed: Gemini default (gemini-1.5-flash) and 4 other Gemini models were fully shut down by Google — replaced with the current 3.x Flash/Pro lineup, new default gemini-3.5-flash-lite
  • Fixed: DeepSeek’s both models (deepseek-chat, deepseek-reasoner) were retired July 24, 2026 — replaced with deepseek-v4-flash (new default) and deepseek-v4-pro
  • Fixed: xAI’s entire model list (all 7 entries, including the default grok-2-latest) was retired — replaced with the current Grok 4.x lineup, new default grok-4.6. Retired xAI slugs were silently redirecting to grok-4.3 and billing at its rate rather than erroring, so this was a hidden cost risk, not just a broken dropdown.
  • Fixed: Mistral’s 3 open-weight models (open-mistral-7b, open-mixtral-8x7b, open-mixtral-8x22b) were retired — removed, added the current Ministral tier, promoted Mistral Medium to recommended default (95% of Large’s quality at 1/4 the cost)
  • Fixed: Perplexity’s sonar-reasoning model was removed Dec 15, 2025 — removed from the list (sonar-reasoning-pro remains, unaffected)
  • Fixed: OpenRouter’s x-ai/grok-2 and deepseek/deepseek-chat slugs were dead — replaced, and refreshed Claude/GPT/Gemini/Mistral OpenRouter slugs to current-generation models
  • All changes verified against each provider’s own …