CloudScale SEO AI Optimizer

Description

Stop paying $99/year for Yoast Premium. CloudScale SEO AI Optimizer replaces Yoast Premium and RankMath Pro, in two plans:

Bring Your Own API Key – free, forever. Paste your own Anthropic Claude or Google Gemini key (2 minutes at console.anthropic.com or aistudio.google.com) and pay the provider directly: about $0.50-$1.50 per 200 posts, under $0.10 per 100 on Claude Haiku, or nothing on Gemini’s free tier. The plugin itself charges nothing. Setup is install, paste key, click Generate Missing.

Managed Subscription – $10 per month. No API key required, AI usage included, cancel anytime.

It covers the technical SEO WordPress leaves out – sitemaps, robots.txt, structured data, OpenGraph, canonical URLs – and adds an AI toolkit that bulk-generates meta descriptions, ALT text, summaries, FAQ schema and related article links. A built-in Site Audit scores your setup across 20+ checks with one-click quick fixes.

Core SEO Features

  • Custom meta title and description per post and page; canonical URL on every page
  • OpenGraph (title, description, image, type, locale) and Twitter/X Card tags
  • JSON-LD: Person (author pages), Article/BlogPosting (posts), WebSite (homepage), Breadcrumb
  • Configurable site name, locale, Twitter handle, default OG image
  • XML sitemap (index + child sitemaps) with configurable post types and taxonomies, plus a plain-text /sitemap.txt for AI crawlers
  • robots.txt editor with AI bot blocking (GPTBot, CCBot, Claude-Web, anthropic-ai and others), plus llms.txt support
  • noindex controls for search results, 404s, attachments, author archives, tag archives and RSS feeds
  • UTM stripping in canonical URLs; widget-pagination and comment-moderation parameters always stripped

AI Auto Pipeline

  • Runs every AI operation in a background process the moment a post is published – no WP-Cron dependency, and optionally again whenever a published post is saved
  • Per publish: meta description, SEO score, focus keyword, ALT text for all images, AI-suggested internal links, AI summary box and Related Articles
  • Gutenberg-safe block-level link injection; classic editor falls back to str_replace
  • 50-word minimum content guard; HMAC-authenticated async request with a 120-second TTL
  • “Re-run AI Automation” button in the metabox with live log output

AI Meta Writer

  • Claude or Gemini, with a model selector: Automatic (always the current recommended model), Claude 3.5/3.7 Sonnet, Claude Haiku, Gemini 2.0 Flash, Gemini 1.5 Pro, or a custom model string
  • Generate meta descriptions per post or in bulk; fix descriptions that are too short or long, and titles outside the optimal 50-60 characters
  • Inline edit button on each row for manual corrections
  • Configurable character range injected into the prompt, auto-retry when the AI overshoots, backoff on HTTP 429
  • Fully editable system prompt with reset to default; Test Key verifies your key
  • Sortable post table (title, date, SEO score, description length, title length, ALT status), timestamped progress log, Stop button
  • Scheduled batch generation via WP Cron

AI SEO Scoring

  • AI rates each post 0-100 with a one-sentence strengths or weaknesses note
  • Calculate SEO Scores runs a bulk pass; Generate Missing scores any post still lacking one
  • Stored in post meta (_cs_seo_score, _cs_seo_notes) and survive deactivation

Title Optimiser

  • AI suggests SEO-optimised replacement titles for every published post, with a before/after score (0-100)
  • Identifies the primary and secondary keywords the article is about
  • One-click Apply updates title and slug and 301-redirects the old URL; “Apply All Suggested” does the lot with confirmation
  • Sort by date or most-commented; suggestions stored in post meta so you can apply selectively

AI Summary Box

  • AI summary box prepended to post content: What it is, Why it matters, Key takeaway
  • Written SEO-first – primary keyword front-loaded, secondary keywords woven in, optimised for search intent
  • Also written into Article JSON-LD as description, abstract and disambiguatingDescription
  • Bulk generation with progress tracking, stop button and paginated list; force regenerate overwrites existing summaries
  • Collapsible card; a global show/hide toggle keeps generated content

ALT Text Generator

  • Audits all post images for missing ALT text and generates it with article context for relevance
  • Configurable article excerpt length sent to the AI (100-2000 characters)
  • Bulk generation with progress tracking; Show All reveals images that already have ALT text

Related Articles

  • Injects related post links at the top and bottom of every post, block-safe in Gutenberg and classic posts
  • AI-scored candidate pool across the full library; configurable counts (2-5 top, 3-10 bottom) with independent toggles
  • Generate Missing processes new posts; Refresh Stale re-runs changed content; Sync Counts trims or fills to new count settings
  • Post Status table shows per-post state (pending, complete, failed) with filter tabs

Audio Narration (Managed Subscription)

  • Turns any post into a spoken MP3 with one click (Generate Audio, for logged-in editors only); a “Listen to this article” player appears under Related Articles
  • Eleven narrator voices, from Cedar (calm, authoritative) to Marin (conversational) to Onyx (deep broadcast)
  • Free voice previews, which never draw on your narration allowance
  • Editable narration prompt controls tone and pacing; defaults to a calm tech-essay read
  • Code blocks are never read aloud; each becomes a short spoken note instead
  • MP3s land in your media library; regenerating replaces the previous narration
  • Includes 500,000 narration characters per month, roughly 9 hours of audio, billed by the actual characters read aloud so there is no per-post limit; a $5 Narration Boost adds a further 400,000 characters that roll over until used

Performance Features

  • font-display: swap to kill Flash of Invisible Text, plus font metric overrides (size-adjust, ascent-override, descent-override) to reduce Cumulative Layout Shift
  • Defer font CSS via the media=”print” swap technique; auto-download CDN (Google) fonts locally for speed and GDPR compliance
  • Font CSS scanner with Auto-Fix All, backup and undo
  • Defer render-blocking JavaScript with configurable exclusions
  • HTML, CSS and JS minification (5-15 percent smaller pages)
  • HTTPS mixed content scanner and one-click fixer across posts, pages, metadata, options and comments

SEO Health Dashboard

  • Dashboard widget with five coverage pillars – Posts (meta), SEO (score), Images (ALT), Links (related articles), Summaries – as colour-coded pills: green >= 90%, amber >= 60%, red < 60%
  • Refresh rebuilds the health cache; it also auto-rebuilds after any bulk AI run, and counters show posts needing an AI run and queued pipeline jobs

Dashboard Integration

  • Post editor metabox and Gutenberg sidebar panel (CloudScale Meta Boxes): custom title, description, OG image, AI summary fields and one-click generation
  • Tab state persists across reloads

Category Fixer

  • Suggests better category assignments using Claude on each post’s title, slug, tags and AI summary against your category list
  • Up to four categories per post, only ones that already exist, never Uncategorized
  • Colour-coded review table (green additions, red removals, grey kept) with a confidence badge
  • Per-post Apply and Skip, bulk Apply All Changed, filters: All, Changed, Unchanged, Low Confidence, Missing
  • Reload re-analyses everything; a per-row button redoes one post. Nothing changes until you click Apply

Category Health and Drift Detection

  • Post counts per category with a pass/fail coverage indicator
  • Drift Detection flags categories that have drifted from their original focus or become catch-all buckets, each with a verdict (drifting or catch-all), confidence score and AI reasoning
  • Sorted by verdict then confidence; elapsed-time counter and Stop button

Readability Analyser

  • Pure-PHP scoring, no AI call required: 0-100 with an Easy / Moderate / Hard label from sentence length, heading density and passive-voice rate
  • Colour-coded metabox badge with sub-metrics (words per sentence, words per heading, passive voice percentage)
  • Sortable Readability column; recalculated on save and after each Auto Pipeline run

Broken Link Checker

  • Finds outbound links in posts and pages that return HTTP 4xx/5xx or fail to connect
  • Server-side HEAD request per URL, deduplicated so each external URL is checked once
  • Results table with post title, anchor text, URL and status. SSRF-safe: link-local, loopback and private IP ranges are blocked server-side

Image SEO Audit

  • Flags Media Library SEO issues: missing ALT text, camera-default filenames (IMG_001, DSC_0045, screenshot2) and oversized files over 500 KB, sorted by issue count with thumbnails and direct edit links

External Services

The plugin contacts the services below, only when you enable and use the relevant feature.

Notes that apply to every service listed here:

  • Key handling: any API key, bot token or licence key you enter is stored only in your own WordPress database (wp_options) and is never transmitted anywhere except directly to that service’s own host.
  • “Post content” means: the post title, up to 6,000 characters of the post body, and the system prompt you configured.
  • No visitor data, personal data, analytics or tracking data is ever transmitted.
  • Nothing is sent from your front end. Calls come from a WP Admin action, a WP Cron batch you scheduled, or the Auto Pipeline on publish/update if enabled.

Anthropic Claude API

Service: Anthropic PBC – https://anthropic.com
Endpoint: https://api.anthropic.com/v1/messages
Data sent: Post content (see note above).
When data is sent: On Generate, Fix or Generate with Claude; on a scheduled batch for posts without a meta description; or on publish/update via Auto Pipeline.
API key: Your own Anthropic key (see key-handling note above).

Privacy Policy: https://www.anthropic.com/privacy
Terms of Service: https://www.anthropic.com/terms
API documentation: https://docs.anthropic.com

Google Gemini API

Service: Google LLC – https://ai.google.dev
Endpoint: https://generativelanguage.googleapis.com/v1beta/models/
Data sent: Post content (see note above).
When data is sent: Same triggers as Anthropic above, when Gemini is your selected provider.
API key: Your own Google AI key (see key-handling note above).

Privacy Policy: https://policies.google.com/privacy
Terms of Service: https://policies.google.com/terms
API documentation: https://ai.google.dev/docs

Google Fonts CDN

Service: Google LLC – https://fonts.googleapis.com, https://fonts.gstatic.com
Data sent: Only the URL of a Google Font stylesheet already registered on your site.
When data is sent: Only on “Download Fonts” (Performance tab), which copies those font files to your server so they are served locally instead of from Google’s CDN – better GDPR compliance and Core Web Vitals.
API key: None required.

Privacy Policy: https://policies.google.com/privacy
Terms of Service: https://policies.google.com/terms

CloudScale Managed API

Service: CloudScale Consulting (Pty) Ltd – https://cloudscale.consulting
Endpoints: https://api.cloudscale.consulting/v1/messages and https://api.cloudscale.consulting/v1/tts for the AI features; and for the subscription itself https://api.cloudscale.consulting/checkout, /status, /cancel, /refund-request, /recover and /recover/verify
What it is: Optional paid alternative to your own key; provides Claude (text) and OpenAI text-to-speech (Audio Narration) on our account. Billed via Paystack, below.
Data sent: Post content (see note above) for text features; for Audio Narration, the full cleaned article text with code blocks removed, plus your narration prompt. Your managed licence key accompanies every call.
When data is sent: On any AI feature or Generate Audio with the Managed API enabled; on subscribe, status check or cancel; and once, non-blocking, if you delete the plugin while a subscription is active, so it is cancelled for you.
API key: Your managed licence key (see key-handling note above).

Privacy Policy: https://cloudscale.consulting/privacy
Terms of Service: https://cloudscale.consulting/terms

OpenAI (optional, Audio Narration with your own key)

Service: OpenAI, L.L.C. – https://openai.com
Endpoint: https://api.openai.com/v1/audio/speech
What it is: Text-to-speech for Audio Narration. Contacted DIRECTLY only when you supply your own OpenAI key; if you use the Managed API instead, the call is made by CloudScale on its account and your site never contacts OpenAI.
Data sent: The cleaned article text to be narrated, with code blocks removed, plus the chosen voice and your own OpenAI key.
When data is sent: Only when you click Generate Audio with an OpenAI key configured and the Managed API off.
API key: Your own OpenAI key.

Privacy Policy: https://openai.com/policies/privacy-policy
Terms of Service: https://openai.com/policies/row-terms-of-use

Paystack

Service: Paystack Payments Africa (Pty) Ltd, a Stripe company – https://paystack.com
What it is: Payment processor for the Managed Subscription.
Data sent: Your email address and payment details, entered by you directly on Paystack’s own hosted checkout page. The plugin never transmits or stores card data.
When data is sent: On Subscribe, when you are redirected to Paystack’s checkout. Cancellations and refunds are handled there too.

Privacy Policy: https://paystack.com/privacy
Terms of Service: https://paystack.com/terms

Telegram Bot API

Service: Telegram Messenger Inc. – https://telegram.org
Endpoint: https://api.telegram.org/bot{token}/sendMessage
What it is: Optional real-time error alerts to a Telegram chat you own.
Data sent: An error summary only – the PHP error message, file name and line number, and the related WordPress post ID or URL.
When data is sent: Only when a plugin error is caught and you have set a bot token and chat ID in Notifications settings. Nothing is sent if it is unconfigured.
API key: Your own bot token (see key-handling note above).

Privacy Policy: https://telegram.org/privacy
Terms of Service: https://telegram.org/tos
API documentation: https://core.telegram.org/bots/api

PayPal (optional, Managed AI subscription checkout)

Service: PayPal Holdings, Inc. – https://developer.paypal.com
Endpoints: https://api-m.paypal.com/ to create a subscription and check its status (https://api-m.sandbox.paypal.com/ in sandbox mode), plus https://www.paypal.com/sdk/js, PayPal’s browser SDK, loaded into this plugin’s admin screen from PayPal’s own origin.
Data sent: Subscriber email address and subscription amount. Card entry happens on PayPal’s hosted checkout; no card data reaches this plugin.
When data is sent: Only when an administrator opens or checks a Managed AI subscription.

Privacy Policy: https://www.paypal.com/us/legalhub/paypal/privacy-full
Terms of Service: https://www.paypal.com/us/legalhub/paypal/useragreement-full

Broken Link Checker (server-side URL probing)

What it is: Your server sends an HTTP HEAD request to each unique outbound URL in your own published posts and pages, to check its status.
Data sent: The URL only, with standard HTTP headers (a User-Agent identifying your site). No post content, no user data.
When data is sent: Only while you run a scan from the Broken Link Checker tab. No automatic or scheduled scanning.
Note: sslverify is disabled so sites with expired or self-signed certificates can still be checked; loopback, link-local and private IP ranges are blocked. These are third-party sites you linked to yourself, so no single terms of service applies.

Installation

  1. Upload the plugin zip via Plugins > Add New > Upload Plugin, or extract to wp-content/plugins/cloudscale-seo-ai-optimizer/
  2. Activate the plugin through the Plugins menu
  3. Go to Settings > CloudScale SEO to configure your site name, OG image, and Person schema
  4. To use the AI Meta Writer, go to the Optimise SEO tab and enter your API key for either Anthropic Claude or Google Gemini
  5. Click Test Key to verify your key, then Load Posts to see your site description status
  6. Use Generate Missing to create descriptions for posts that have none, or Fix Descriptions to correct any that are outside your configured character range
  7. Visit the Performance tab to enable font optimization, JavaScript deferral, and HTML minification

Important: Deactivate any other SEO plugins (Yoast, RankMath, All in One SEO) before using this plugin to avoid duplicate meta tags in your page output.

FAQ

What does this plugin deliberately not do?

No third-party SEO data, keyword research databases or rank tracking. No hidden upsells, no tracking and no lock-in: bring-your-own-key is free forever, and the optional subscription cancels at any time with no data loss.

Do I need an API key?

Only if you want to use the AI Meta Writer or ALT Text Generator features. The core SEO functionality (canonical URLs, OpenGraph, Twitter Cards, structured data, custom titles and descriptions) works without any API key.

Which AI provider should I choose?

Both work well. Anthropic Claude tends to produce slightly more nuanced descriptions. Google Gemini Flash is extremely fast and cost effective for large sites. You can switch providers at any time without losing any generated content.

How much does it cost?

Bring Your Own API Key (BYOK) – free. You supply your own Anthropic Claude or Google Gemini API key and pay the AI provider directly. Generating descriptions for a typical 200-post blog costs approximately $1.20–$1.50 using Claude Sonnet, or under $0.50 using Gemini Flash. Claude Haiku is under $0.10 per 100 posts. Google Gemini has a free tier suitable for most personal blogs.

Managed Subscription – $10 per month. Your AI usage is included; no API key needed. Cancel anytime – your generated content stays in WordPress post meta after cancellation.

Should I leave “noindex RSS feeds” enabled?

Yes, for almost every site. WordPress publishes an RSS feed for every post, category, and comment thread, and search engines crawl all of them even though they are just XML copies of your content – they waste crawl budget and show up in Google Search Console as “Crawled – currently not indexed”. This setting sends a noindex header on feed URLs while leaving the feeds fully working for RSS readers, podcast apps, and feed directories (none of those rely on Google indexing the feed URL). Only disable it if you have a specific reason to want your raw feed URLs appearing in Google search results.

Will this conflict with Yoast or RankMath?

Yes. Running two SEO plugins simultaneously produces duplicate meta tags. Deactivate your existing SEO plugin before activating this one.

Where are my meta descriptions stored?

In WordPress post meta, using the key _cs_seo_desc. Titles use _cs_seo_title. OG images use _cs_seo_ogimg. These are standard post meta fields that persist if you deactivate the plugin.

Can I use a custom system prompt?

Yes. The AI Meta Writer section includes a fully editable system prompt. The character range you configure in the min/max fields is injected automatically at call time.

What happens if the generated description is the wrong length?

The plugin measures the returned description before saving it. If it is outside your configured range, it automatically sends a correction request to the AI with the exact character count and direction. The corrected version is what gets saved.

How does font display optimization work?

The plugin scans your theme and plugin CSS files for @font-face rules and injects font-display: swap to prevent fonts from blocking page rendering. It also adds metric overrides to reduce layout shift when fonts load. All changes create a backup that you can undo with one click. Enable these features in the Performance tab.

How does JavaScript deferral work?

Adding the defer attribute to script tags allows them to download in parallel with HTML parsing and execute only after the document is ready. jQuery and other commonly problematic scripts are excluded automatically. You can add additional exclusions by script handle or URL substring.

Can I schedule automatic description generation?

Yes. The Scheduled Batch tab lets you select which days of the week to run automatic generation. The batch runs at midnight server time and only processes posts that do not yet have a meta description. It never overwrites existing ones.

What does Auto Pipeline do?

Auto Pipeline fires a background process the moment a post is published. It runs every AI step in sequence: meta description, SEO score, focus keyword, ALT text for all post images, AI-suggested internal links, AI summary box, and Related Articles. The process runs in a separate PHP request so it does not slow down the publish action. You can also trigger a re-run manually from the post metabox using the “Re-run AI Automation” button.

What is the Automatic model option?

Selecting Automatic tells the plugin to always use the current recommended model for your chosen provider (currently claude-sonnet-4-6 for Anthropic and gemini-2.0-flash for Google). When Anthropic or Google release a better default model the plugin will automatically switch without any settings change on your part. Users who have already pinned a specific model are not affected.

How does Related Articles work?

The plugin scores all posts against each other using shared categories, tags, and content signals, then stores a ranked candidate pool per post. The top two to five links appear above the post content and three to ten appear below. You control the counts from the Related Articles settings. The Generate Missing button processes unscored posts; Sync Counts adjusts existing results to match updated count settings without running the full pipeline again.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“CloudScale SEO AI Optimizer” is open source software. The following people have contributed to this plugin.

Contributors

Changelog

4.21.548

  • Fixed: Checking “Enable automatic scheduled batch” left the day checkboxes greyed out until the page was reloaded – the live-toggle listener referenced the wrong element id.
  • Fixed: The Title Optimiser widget’s progress line never updated, unlike every other AI widget – the status element was missing from its markup.
  • Removed: Several dead/orphaned code paths (an unused AI Summary post-list toggle, an unused Category Health/Fixer “Hide Posts” toggle, and an unused legacy PayPal subscribe form superseded by the shared licence card) that referenced page elements that don’t exist and were never reachable from any button.

4.21.547

  • Fixed: Background title-analysis batches could get permanently stuck (“0 of N processed”) with no error shown, if a single AI call ran long. The batch used to process every queued post in one long-lived request; a slow call could be cut off by the server’s own connection timeout before the plugin’s own error handling ever ran, silently dropping that post and leaving the whole batch wedged with nothing left to resume it. It now processes one post per background tick and reschedules itself after each one, so a single slow call can no longer strand the rest of the batch.
  • Fixed: The “Enable it” link in the Auto Pipeline banner did nothing when clicked – it pointed at an anchor with no matching target on the page.
  • Added: The dashboard widget now shows Auto Pipeline status (active/disabled) alongside Batch status.
  • Fixed: Clicking the Critical/Warning count in the dashboard’s Site Audit summary now jumps straight to that finding and highlights it, instead of leaving you to find it in the full results table.

4.21.542

  • Fixed: Capitalised abbreviations are read as letters instead of as words. AWS is narrated as A.W.S and API as A.P.I, on every voice: the text handed to the narrator is rewritten, so this does not depend on the narration prompt, which the fast managed voice model does not read.
  • Note: Left as written, because spelling them out would be the worse reading: abbreviations pronounced as words (NASA, JSON, REST), a word capitalised for emphasis (“Do NOT enable this”), Roman numerals (Part III), anything carrying a digit (EC2, S3) and an ALL CAPS HEADING.
  • Note: Editing the narration prompt still moves your narrations onto a dearer, instruction-following voice model. A prompt this plugin shipped as its default no longer counts as an edit, so sites holding an older default keep the cheap model.

4.21.540

  • New: Regenerate links button under a related links block, for a post whose links are there but out of date. The buttons added in 4.21.539 only appear where a block has nothing in it at all.
  • New: Change any related link for an article you pick. Each link is listed under its block with a Change button that searches your published articles by title. Your choice is badged as yours and holds its place through later regenerations, until you set that slot back to Automatic.
  • Note: The panel and its buttons are visible to admins only. An article the other block on the same post already links is refused with a reason, because the two blocks never show the same article and accepting it would have dropped it from one of them silently.

4.21.539

  • New: Generate buttons on the post itself, for the summary, the AEO answer and the related links. Each appears where its block would be, visible to admins only, so a post the automation never covered can be filled in from the page you are reading. Until now a block with no content rendered nothing at all, which meant that with the Auto Pipeline switched off there was nothing to click anywhere on the post.
  • New: Regenerate Links button in the CloudScale SEO Auto Run panel on the post editor, alongside the summary and AEO buttons already there.
  • Note: The related links block above an article needs 2 eligible posts and the one below it needs 3. Where a post has fewer, the button now tells you that instead of appearing to do nothing.

4.21.522

  • Fix: The Organization schema no longer claims your personal social profiles as its own, and no longer uses your headshot as a company logo. It was reusing the Person schema’s sameAs list, which tells search engines that your personal LinkedIn profile identifies a company. That competes with your own Person schema for the same URL, so neither identity resolves cleanly.
  • New: Organization Schema card, with its own name, URL, logo and sameAs fields. Name and URL still fall back to your employer details if you leave them blank, so existing sites are unaffected.
  • New: Profile page setting in the Person Schema card. Pick the page about you, usually About, and it is marked as a ProfilePage with you as its subject. This is the strongest signal available for tying a site to a named person, and an About page has none of it by default.
  • New: A second employer can be named. If you have a day job and also run your own practice, naming both is what lets an AI model join the identity it already knows from press coverage to the one it learns from your site. Naming only one is the usual reason an AI answer will claim that a known executive has no blog.
  • Fix: A post’s publisher logo was also your headshot rather than a company logo, and it is taken from the new Organization logo field now.
  • Fix: The Site Audit no longer warns that a post’s publisher is missing when it is correctly present. It checked for a property that a reference does not carry, and now resolves the reference against the Organization on the page.
  • Change: The schema nodes now reference each other. WebSite says who authors and publishes it, a post’s publisher points at your Organization instead of a separate copy built from your site name, and the page about you links back to your Person entry. Previously each node stood alone and nothing stated that the site was written by the person described in it.

4.21.518

  • Change: Follow along is no longer a switch. Each sentence is highlighted as the narration reads it, from the moment you press play, and there is nothing to turn on. The button that used to sit under the player is gone, along with the line reporting how many sentences it matched, which was a number only the author of the article could act on.
  • Change: The author’s own line under the player now says only whether the timings were measured, and offers a button only when a measurement did not run or did not work. A narration that has been timed shows a fact and asks nothing.

4.21.517

  • New: Narration now rests for about a second after a title and between paragraphs. It used to read a heading straight into the sentence that followed, with no gap.
  • Note: The rest is real silence inserted into the audio, because it cannot be asked for. The speech service accepts no pause markup and caps its own pause well under a second whatever it is told: measured on a heading followed by a sentence, the plugin’s current text produces 660ms, the best of five wordings produces 810ms, and adding “leave a full second of silence” to the narration prompt produces 690ms.
  • Note: Narrations made before this release keep the pacing they were made with. Regenerate an article to hear the rests.

4.21.515

  • Change: Follow along is now timed from the audio itself rather than estimated from the text. After a narration is made, your browser reads the finished audio once, finds where the voice actually starts each sentence, and stores those times with the article. Readers get the measured times and pay nothing for them.
  • Change: The highlight no longer moves early, because it no longer has to. The small lead existed to cover a boundary that was estimated and could be late as easily as early; a measured boundary needs no allowance.
  • Change: Existing narrations are timed too. Open a narrated post as an editor and the measurement runs once, with no re narration and no credits spent. There is a button on the player to run it again.
  • Fix: The narration menu now opens on the voice you last used, not on the site default. Speed and accent were already remembered across articles and the voice was not, so every new article reverted to the default however many times in a row you had chosen something else.
  • Fix: A speed or accent choice that fails to save now says so and puts the control back to what is stored. It used to keep the new value on screen and quietly keep the old one on the server, which is what made narration look as though it forgot your choices.

4.21.499

  • New: Follow along. Each sentence of the article is highlighted as the narration reads it, and clicking a sentence jumps the audio to that point. Off until you switch it on, and then remembered.
  • Note: The highlight is anchored to points measured in the audio itself, with the sentences in between apportioned by length, because no speech service reports word timings. It can therefore run slightly early or late in a long passage and corrects itself at the next anchor.
  • Note: The article text is never rewritten. Matching happens in your browser, a sentence that cannot be matched is left unhighlighted rather than guessed at, and the player says how many it matched. Code blocks and tables, which are not narrated, are never highlighted.
  • Note: Narrations made before this release carry no timings, so the button appears once an article has been narrated again.

4.21.492

  • Change: Narration is several times faster and is split into far fewer pieces. The same 21,000 character article went from 107 pieces to 6, completing in about 11 seconds. Pieces are now produced four at a time instead of one after another, each piece can be four times larger, and narration reaches the voice service directly rather than through a routing layer that was failing to place roughly one request in five.
  • Change: The progress dialog now shows an estimated time remaining, measured from the job’s own pace rather than assumed.
  • Change: The progress dialog now tells you how many parts came from your managed plan and how many from your own OpenAI key, and keeps saying so. It used to report only the most recent part, so it alternated between the two every few seconds, which read as your plan failing when it was working normally.
  • Change: When a part cannot be produced on your managed plan, the dialog now says why: the voice service did not respond, your monthly allowance is used up, your licence was not accepted, or the service was rate limiting.
  • Fix: The dialog showed a generic model name instead of the voice tier, and the same underlying mistake had disabled the setting that keeps one article on a single voice, so a mid article switch could change the narrator without saying so.
  • Fix: The dialog named the voice service’s internal id rather than the voice you chose, so picking Marin could report a name you had never been offered.
  • Fix: A part delivered twice could be counted twice in the progress figures.
  • Fix: Uninstalling now removes the narration working data left behind by a narration interrupted part way.
  • Change: Requests to the managed service now identify the plugin, version and feature making them, so usage can be attributed to the feature that caused it. If you use the managed subscription, this release is required.

4.21.482

  • Fix: Narration was being split into far more pieces than it needed to be, so a long article showed a count like “Chunk 1 of 107” and took correspondingly longer. The size of each piece was being set by the standby voice model, which is only used when the usual one is not responding, rather than by the model actually doing the work. The same article is now around 31 pieces, measured on a real 21,000 character article.
  • Fix: Narrations were nearly always being produced by the standby voice model, with the progress screen reporting that the usual one was not responding. The managed service was allowing it 12 seconds to answer when it genuinely takes between 9 and 39, so it was being given up on rather than being unavailable. It is now given long enough, which also means narration sounds like the voice model it is meant to and costs a fraction of what the standby one does.
  • Fix: A single upstream hiccup on the first piece of a narration could silently send the whole article to your own OpenAI API key, at premium rates, while your managed allowance sat unused. Each piece is now judged on whether it can be paid for, rather than on whether the first piece succeeded, so a passing failure costs one piece instead of the article. The narration record also says why it switched, where before it ended up blank.
  • Fix: The progress screen said “CloudScale managed model” instead of naming the voice tier, and the same underlying mistake meant the setting that keeps one article on a single voice was being ignored, so a mid-article switch could change the narrator without saying so.
  • Fix: A narration that was cancelled, that failed, or that switched to your own OpenAI API key partway through still cost the full article against your monthly narration allowance. Each piece is now charged as it is produced, so an unfinished narration only costs what it produced. A completed article costs the same as it always did, and the whole article still has to fit your remaining allowance before it starts, so a narration cannot run out of allowance halfway.
  • Fix: A piece of audio that was delivered twice, which can happen when a slow response is retried, could be charged twice.
  • Change: While a narration is being created, the progress screen now shows how much of your monthly allowance this month has used, including the article being narrated, instead of how much was left. The figures shown could not previously be reconciled with each other, because rolled over boost characters were counted in one of them and not the other. Boost characters are now reported separately.
  • Change: The progress screen names the voice you chose. It was showing the internal name the voice is mapped to on the server, so choosing Marin could report a voice name you had never seen offered.

4.21.473

  • Change: The monthly narration allowance on the managed plan rises from 400,000 to 500,000 characters, roughly nine hours of audio, and the monthly image allowance from 15 to 30. Existing subscriptions are raised automatically with nothing to do at your end, and a licence deliberately set higher is not reduced. As before this is funded by the low cost voice model: 500,000 characters costs about $0.31 a month to produce, against a plan that bills $10.
  • Fix: The help page said no single article could exceed 400,000 characters. The real per-article ceiling is 200,000 and always has been, so the figure quoted was one nobody could reach. Corrected, and the published allowance figures are now checked against the server’s own values on every build.

4.21.465

  • Change: While a narration is being created, the progress screen now says when the audio came from an alternative voice model rather than the usual one, and why — your chosen accent needs it, your customised narration prompt needs it, or the usual model was not responding. Before this, every model was named the same way, so the normal default looked like a fault and a genuine substitution looked normal. The voice preview on the Settings page labels itself the same way.

4.21.461

  • Change: The three AI Summary fields are now written to stand on their own. AI answer engines quote them with no article and no title around them, so each field names its subject instead of relying on words like “it” or “this feature”. Summaries already saved on your posts are unchanged until you regenerate them.
  • Change: The author of each article now carries their credentials in structured data. Job title, employer and profile links used to sit in a separate block that said nothing about who wrote the piece. The article’s author now points at that block, so a search or answer engine can see the post was written by a named person with a relevant role.
  • Change: Each summary field can name the section of the article that supports it, published as structured data. The AI is given the article’s real headings and any answer that does not match one is discarded, so an invented section is never published.
  • Fix: A post that had been through both the Auto Pipeline and the Site Audit FAQ quick fix published its FAQ block twice. It now publishes once.
  • Fix: A post with a HowTo or custom schema block could never be given FAQ schema, because the two were stored in the same place. FAQ schema now has its own storage, so a post can carry both.

4.21.459

  • Change: The monthly narration allowance on the managed plan rises again, from 300,000 to 400,000 characters, roughly 7 hours of audio. Existing subscriptions are raised automatically with nothing to do at your end. As before this is funded by the low cost voice model: 400,000 characters costs about $0.25 a month to produce, against a plan that bills $10.

4.21.454

  • Change: The narrator accent picker is now Default (US) and British, the two accents the narration voices genuinely have. Irish has been removed alongside Australian and South African: those accents only ever worked by asking a much more expensive model to imitate them, and the imitation was the reason narrations sometimes drifted mid-article. A post with a removed accent saved falls back to whichever accent your site is currently set to, or Default (US) if none is set. Every narration now comes from the same voice model, so audio is consistent from post to post.
  • Change: The narration prompt now explains that leaving it at the default keeps you on the fast, low cost voice model, and that writing your own moves narrations to a costlier model that reads instructions, using up the monthly allowance faster. The progress screen names the model used either way.

4.21.453

  • Change: The narrator accent picker now offers Default (US), British and Irish. The Australian and South African options have been removed. A post that had one of them saved falls back to Default (US) automatically; nothing else about narration changes.

4.21.451

  • Change: The monthly narration allowance on the managed plan rises from 200,000 to 300,000 characters, roughly 5.5 hours of audio. Existing subscriptions are raised automatically, with no action needed.
  • New: Narration is now produced by a lower cost speech model when that model can deliver exactly what you asked for, which is what pays for the larger allowance. Your accent choice, chosen voice and speaking speed are all preserved. Requests the cheaper model cannot serve faithfully, meaning the Irish, Australian and South African accents or a narration prompt you have customised, continue to use the original model instead of quietly losing the setting.
  • New: The narration progress screen, the “narration ready” confirmation and the settings page voice preview now all name the exact speech model and voice used, so you can always tell what you are listening to.
  • fix(models): installs that had saved the corrupted “Claude Sonnet 4 (stable pinned)” id are now repaired automatically. Fixing the dropdown in 4.21.446 stopped anyone new picking it, but anyone who already had it kept getting API errors on every call, because model ids are passed to the provider without an allowlist so a custom model can be typed in. The existing model-migration map now rewrites the broken id to claude-sonnet-4-20250514 on the next options read.
  • feat(build): the build now rejects malformed AI model ids. Anthropic ids never contain a dot, so a version string spliced in by a bump script is detectable — which is exactly how the id above was corrupted. Migration-map keys are exempt, since repairing an install requires naming the broken id.
  • fix(models): the “Claude Sonnet 4 (stable pinned)” option sent a malformed model id. A version-bump script had rewritten claude-sonnet-4-20250514 into claude-sonnet-4.20.140514, and because model ids are passed through without an allowlist, choosing that option produced an API error rather than a pinned model. Restored from git history; the current build script uses anchored replacements and cannot corrupt it again.
  • fix: the readme Description was over WordPress.org’s limit (3022 words against 2500) and the live plugin page was truncating the external-services disclosure mid-sentence. WordPress.org counts words, not characters, and folds unrecognised sections such as External Services into the Description before trimming. Prose condensed to 2193 words with every service, endpoint and legal URL retained. The build now blocks on this check.
  • Fix: The narrator accent picker (British, Irish, Australian, South African) now genuinely changes the accent of generated audio. Previously the accent request was sent in a way the speech model usually ignored, so narrations stayed American.
  • Fix: Voice previews on the settings page now play in your selected accent instead of always sounding American.
  • Change: Audio narration is now billed by the actual characters read aloud against a monthly pool of 200,000 characters, with no per-post limit. Narrate many short posts or a few long ones until the characters add up – short posts no longer each cost a whole “credit”. The $5 Narration Boost now adds 400,000 characters. Usage meters show characters instead of credits.
  • Fix: The “Optimise Click Through Rate” tool no longer strips the article’s primary keyword from the title (e.g. it now keeps “Embeddings in AI” instead of replacing it with a metaphor). The writer must preserve the core search term and the scorer now penalises titles that drop it.
  • Fix: CTR scores are shown honestly as a potential score out of 100 (an AI estimate for comparing versions), not as a fake click-through percentage.

4.21.393

  • New: Animated progress screen while a narration generates (audio equalizer, live “audio X of N” progress bar) with a note that you can leave the page – it keeps running on the server.
  • New: Managed subscribers see how many narrations they have left this month during generation (e.g. “29 of 30 left”); bring-your-own-key users see “Using your own OpenAI key”. The count comes back on the generation response, with no extra API call.
  • New: If audio can’t be generated you get a clear on-screen message explaining what to do (enable the managed subscription or add an OpenAI key in Settings), instead of a silent failure.

4.21.391

  • Change: Audio narration now runs entirely on the server as a background job. Click Generate Audio once and you can close or background the browser (or lock your phone) – it keeps generating and finishes on its own. Returning to the post shows the finished player. This fixes failures on long articles and when the browser was backgrounded on mobile.

4.21.388

  • New: The Generate Audio voice menu now groups voices into Female and Male (plus Neutral), so you can quickly pick a male or female narrator. Every voice remains selectable.
  • New: A success popup confirms when a narration is ready and stays on screen for 10 seconds (with a “View it now” button) before refreshing the post.

4.21.387

  • Change: Audio narration is now managed-first with a fallback to your own key. If your managed subscription is enabled, narrations use the managed service (with the included 30/month allowance); if a managed call fails and you also have your own OpenAI key, it falls back to that so narration never gets blocked. Sites without the managed subscription keep using their own OpenAI key.

4.21.386

  • Change: Audio narration now uses your existing OpenAI key directly (the same key the plugin suite already uses for image generation) with no proxy and no monthly quota. The managed service is only a fallback when no OpenAI key is present. You no longer need to configure a separate key on the managed server.

4.21.385

  • New: Per-post narrator voice – clicking Generate Audio opens a menu of all 11 voices (the post’s current/default highlighted); the chosen voice narrates that post and is remembered on it, so different posts can use different voices. The Settings voice is the site-wide default.
  • Fix: The “Optimise Click Through Rate” button now always shows a clear error message on failure instead of ever failing silently.
  • Fix: The Generate Audio and Optimise Click Through Rate button scripts are now delivered inline, fixing intermittent cases where the buttons appeared but did nothing.

Older releases are listed in CHANGELOG.md, which ships with the plugin and covers every
version back to 4.0.0. They were removed from here because WordPress.org truncates this
section at 5000 words without saying so, and a build that adds an entry every time would
have crossed that line within a release or two.