Changelog
Every Unstale release, newest first. Free plugin and Pro add-on, same page.
-
Fixed
- A line break in a SeedProd, Elementor or Divi heading is kept when the page is refreshed, instead of gluing the two words together.
-
Fixed
- A SeedProd refresh that stopped right after writing the layout can now be retried. It finishes the live page, metas, date and cache purge without writing anything twice, and offers no Restore button.
-
Fixed
- A Divi or Elementor refresh that stopped right after writing the page can now be retried. It finishes the metas, date and cache purge without rewriting the page, and offers no Restore button.
-
Improved
- Divi and Elementor pages whose text modules hold scripts, widget shortcodes, map or video iframes, SVG icons or forms can now be refreshed. Each element comes back byte for byte in its own module.
- A rewrite that moves or copies one of these elements to another module is refused and can be retried, before anything is published.
-
Fixed
- A post using a template its theme only declares for pages no longer ends a refresh as Failed after its content was written.
- Such a refresh can be retried. It finishes the metas, date and cache purge without rewriting the post, and offers no Restore button.
- Restoring a post or republishing a retired one no longer resets that kind of template to the default one.
-
New
- Select refreshes in the review queue and approve, reject or cancel them in one go.
- A notice counts the refreshes acted on, and those skipped because they were not awaiting review or you cannot edit their post.
-
Improved
- The check of the published post reads at most 2 MB.
Fixed
- A post whose structured data cannot be read is no longer treated as having none, so it never gets a second Article.
- Article types written as full schema.org addresses, or listed with other types, are now recognized.
- Unstale no longer mistakes an older copy of its own Article, served from a page cache, for one added by another plugin.
-
New
- The unstale_article_post_types filter lets a blog kept in a custom post type receive the Article too.
Changed
- The Article structured data Unstale adds now goes on posts only, never on pages.
- A page that received an Article from an earlier refresh no longer prints it.
-
New
- Before asking for structured data, Unstale reads the published post. If it already carries an Article, none is requested.
- With an SEO plugin active, Unstale now adds its Article when the post has none, and removes its own when the post already has one.
Improved
- The structured data a refresh adds is now an Article only. Google no longer shows FAQ or HowTo rich results, so asking for them spent tokens for nothing.
Fixed
- The structured data Unstale stores keeps its accented letters and quotes, and Restore puts it back reliably.
-
Improved
- At Strong and Maximal, the structured data is now an Article only, and only when the post does not already carry one.
Changed
- Unstale Pro now needs Unstale 1.36.0 or newer.
-
Fixed
- The old URL of a post whose slug uses non-Latin letters (Cyrillic, Greek, Chinese and others) now redirects to the post that replaced it, instead of returning a 404.
- The Add a redirect form keeps such URLs whole instead of cutting them short.
-
Improved
- A request blocked by Google's content filter now says so and is not retried, since the same request gets the same refusal.
Fixed
- The research step now sends the opening of the post with its keyword, so Google's content filter no longer blocks it by mistake on a short product name.
-
New
- Unstale > Redirects is always in the menu, with an Add a redirect form to send an old URL of your site to a published post.
- When a post that other redirects point to is retired in turn, those redirects now go straight to the new post, in one hop.
- A redirect can no longer point to a post that is not published, and a notice on the Unstale screens counts the redirects that stopped working.
- Restore the previous version of a consolidated post names the retired posts that still redirect to it.
Improved
- The journal line of a consolidation names the posts it absorbs.
Fixed
- On Elementor, Divi and SeedProd posts, a link of the original post in a heading or a button text is kept at publication, and no internal link is added there.
-
New
- A refresh that points a link of the original post somewhere else now waits for your review, even with automatic publishing on.
- A refresh that removes a link of the original post waits too, at the Minimal, Balanced and Strong levels. At Maximal the removed link is listed without holding the refresh.
- The review queue lists removed links, changed link targets and other added links.
- The Unstale block under the post editor counts the links of the original post that the refresh lost.
-
Improved
- The rewrite of a consolidation now reads the section headings and a bounded excerpt of each retired post, so their unique facts and angles can be absorbed.
- Private and password-protected posts are left out of that material.
Fixed
- Retiring posts into a post that is no longer published is refused, and nothing is unpublished.
- Restore the previous version of a consolidated post discards its pending retirement proposal, with Unstale 1.35.0 or later.
-
Fixed
- With automatic publishing on, the bulk refresh notices now say that Unstale also holds back a refresh that changes a link of the original post, with Unstale 1.34.0 or later.
-
- The documentation now carries a setup video hosted on YouTube. Nothing loads from YouTube or any other Google service until you click play: before that, the page shows a still image served by unstale.ai.
- After that click, the player is served by Google from youtube-nocookie.com. Google then receives your IP address and may store data in your browser, under Google's privacy policy.
- The site itself still sets one cookie at most, and runs no advertising trackers. The privacy policy describes the video under Videos from YouTube.
- The same day, a second video joined the documentation: a first refresh, from the estimate to the approval. It loads the same way, nothing from YouTube until you click play.
- On October 8, a third video joined it, under Content health: a whole batch of posts, from the estimate to the approval of each refresh in the review queue. It loads the same way.
- On October 9, a fourth video joined it, under Content health: a batch scheduled for a later date, which starts by itself and waits in the review queue. It loads the same way.
-
Fixed
- A rewrite that loses a shortcode, embed or script now fails that part at once and retries it alone, instead of failing the whole refresh at publication after every step was paid.
-
New
- In block editor and classic editor posts, the refresh shows each media library image to the model and rewrites alt text that is empty, a file name, generic or wrong.
- From the Balanced level up, a caption is added where an image has none and one helps the reader.
- An empty alt text in the media library is filled at publication, and Restore the previous version empties it again.
- The review queue lists every image the refresh changed.
- The cost estimate counts the images of the post.
Fixed
- The wrong choices of a Pro quiz are no longer fact-checked as new claims, which held some refreshes in review.
- Models that do not read images skip this step at no cost.
-
Improved
- When a model answer cannot be read as JSON, the whole answer is kept in the job log.
Fixed
- A brief outage of the provider's model list no longer fails a refresh; the step is retried, and a provider that is really disconnected still fails after the last attempt.
- Retry refuses a refresh whose post changed since it started, before paying for any step, and asks for a new refresh.
- The enrich and internal linking steps get the same output budget as the rewrite, so a thinking model is no longer cut off.
-
Fixed
- The editor block no longer says you can keep writing during a refresh; editing the text makes publishing refuse it, and the block now says so.
- The refresh summary counts outdated facts as found, not corrected.
- With an SEO plugin active, structured data shows as proposed, not written, instead of ready to publish.
- The review queue shows web searches the provider did not report as n/a instead of 0.
- A published refresh in the review queue links to Restore the previous version instead of pointing to native revisions.
- A Divi or Elementor page whose text cannot be extracted stops before any AI call.
- Divi and Elementor refuse to publish a shortcode placeholder the model wrote.
- A self-closing SVG icon no longer hides the text after it from the rewrite.
-
Changed
- The model catalog carries Google's new Gemini Flash rate ($1.50 / $7.50 per million tokens from January 1, 2027); estimates keep the current rate until then.
-
Fixed
- "Check again" on the Dashboard > Updates screen now looks for a new Unstale Pro release right away, instead of up to 12 hours later.
-
Fixed
- The Strong and Maximal enrich step gets a larger output budget, so a thinking model is no longer cut off before it answers.
-
Changed
- Requires Unstale 1.32.2.
Fixed
- The Automation screen says when the chosen model's provider is not connected, and marks those models in the list.
-
Fixed
- Activating Unstale from the Plugins screen opens Get started again; a background request no longer used up the redirect.
-
Fixed
- Confirm with AI on the cannibalization screen stops at the first refusal when the default model is not served, and shows the reason once instead of failing group after group.
-
Fixed
- Unstale admin screens load their scripts and styles again while refreshes wait for review; the menu badge no longer breaks them.
-
Fixed
- A refresh no longer runs on another provider's model when the default model's provider is not connected; it is refused and names the setting.
- When a provider runs a different model than the one requested, the log names it and the cost follows it.
-
New
- A refresh checks that the YouTube videos in the post are still available.
- A deleted, private or non-embeddable video is replaced with a relevant YouTube video found by web search and checked before use.
- The review screen lists the videos that were replaced or kept.
Improved
- The plugin's outbound requests no longer send your site's address.
-
Fixed
- When the model picked for automation is not served, the notice points to Unstale > Automation to change it, not to the default model.
-
Changed
- Requires Unstale 1.32.0.
Fixed
- The automation notice also shows when the default model's provider is not connected.
- Bulk refresh refuses the whole batch once, naming the cause, when the model's provider is not connected.
-
Improved
- A fact-check correction only says what its source says, prefers sources from the last 12 months, and links to the page itself rather than a home page.
Fixed
- The fact check now knows today's date, and no longer names the "latest" or "flagship" version of a product from the model's memory.
-
Improved
- A year in your permalinks no longer stops the date from moving on a post whose year stays the same.
Fixed
- The publish date no longer moves when the new date would change the post's address. Hour, minute and second tags, and post types with a dated structure of their own, are now covered.
-
New
- With automatic publishing on, a refresh waits for your review when the fact check finds an outdated figure it added, instead of going live with it.
- The Unstale menu shows how many refreshes are waiting for your review.
Improved
- The review notice and the editor box say why a refresh waits while automatic publishing is on.
-
New
- The quiz has a Complete style by default, with numbered badges, answers shown as cards and colored feedback.
- The quiz resists themes that restyle lists and buttons: no more bullets in front of answers or uppercase buttons.
- Choose the quiz style (Complete or Minimal) and its accent color under Settings, Writing. Without a chosen color, the quiz follows your theme's link color.
Improved
- With automatic publishing on, the bulk refresh notices and the Automation screen say that a refresh waits for your review when the fact check finds an outdated figure it added (requires Unstale 1.30.0).
-
Fixed
- Video and other embed blocks are kept out of the rewrite and come back exactly as they were, so the AI can no longer break their markup and get the refresh refused.
-
Improved
- When a rewrite is still refused for its block markup, the error shows the passage where the markup breaks.
Fixed
- A rewrite whose block comments came back with a closing comment missing its dashes, or a paragraph or list item missing its opening comment, is repaired instead of refused, so the refresh no longer fails after two paid attempts.
-
Fixed
- A post with a code sample in a shortcode that opens an HTML tag it never closes is refused before any AI call, instead of at publication after every paid step.
- On SeedProd pages, a year inside a shortcode no longer publishes as a raw %%UNSTALE_YEAR%% marker.
- On SeedProd pages, the publish date stays when the live page still shows the previous text.
-
Fixed
- Strong and Maximal rewrites are told to keep the protected parts of the page (shortcodes, embeds, scripts, icons, forms). A part the model dropped made publication refuse a refresh that was already paid for.
-
Fixed
- In Settings, a model card that carries a badge keeps its name next to the radio button instead of pushing it to a second line.
- The "provider not connected" badge stays on one line on narrow screens.
-
Improved
- The review screen says when a refresh changes nothing in the text and the date will stay, and the job summary names that reason.
- Model cards in the settings carry a "Best for quality" or "Best for volume" badge from the catalog, and the ratings follow a revised method.
Changed
- The publish date moves only when the refresh changed the text of the post. A refresh that only adds links, edits markup, metas or the title year leaves the date where it was.
Fixed
- On Content health, the Bulk actions menu and its Apply button stay visible on screens narrower than 782 px.
-
Changed
- Claude Sonnet 5.5 is the default model on a new install. It replaces Claude Sonnet 5 at the same price.
Fixed
- A long post built with blocks no longer stops at the rewrite step with "block comments unpaired". A long section is now cut between blocks, never inside one.
- An H2 carried by a third-party heading block, GenerateBlocks Headline for example, stays with its block when the post is split.
-
Improved
- Get started loads much less data on sites with many refreshes.
Fixed
- A rewrite that breaks the block markup of a post, a list item left open or a stray closing comment, is retried instead of reaching the review queue.
- Publishing refuses to write block markup in worse shape than the original post, which stays untouched.
- Without an SEO plugin, the JSON-LD Unstale prints no longer carries publication or update dates written by the model.
-
New
- Get started is a checklist that reads your site: provider connected, model served, first post refreshed, diff reviewed. One action at a time, nothing to tick by hand.
- The first refresh is one post, chosen among the five that waited longest, with its estimate before anything is spent.
- When the default model needs a provider you have not connected, one click switches to a model your connected provider serves, the recommended one first.
- A notice tells you when your provider is connected, and a notice on the Plugins screen replaces the redirect after a group activation.
Improved
- An empty review queue sends you to Get started instead of the Posts list.
-
New
- A Writing section in Settings, where an add-on can put its writing fields.
- Add-ons can store their settings in a refresh when it starts.
-
New
- Unstale > AI Agent, a screen of its own to connect Claude Code, Codex, Hermes Agent or any MCP client. Settings no longer carries it.
Improved
- "Let AI agents approve or reject refreshes" moved to that screen, with its own Save button. Your current choice is kept.
-
Fixed
- Without an SEO plugin, the JSON-LD of a refresh no longer carries publication or update dates written by the model.
- Needs the free Unstale plugin in version 1.28.1 or newer, up from 1.27.0. Update the free plugin first and Pro second.
-
New
- With the free Unstale 1.28.0, the Get started checklist shows a licence step: paste the key from your purchase email, or see that the licence is active.
-
New
- Site-wide instructions (persona, style, tone, form of address) applied to every refresh.
- Turn the quiz on or off for the whole site.
- Turn the quiz on or off for a single article, from its Unstale box.
- Needs the free Unstale plugin in version 1.27.0 or newer, up from 1.24.0. Update the free plugin first and Pro second; wordpress.org can take an hour longer to propose it.
-
New
- Gemini 3.8 Flash is the recommended model, marked with a Recommended badge in Settings, and the default on new installs.
Changed
- GPT-6 Sol replaces GPT-5.6 Terra in the model cards. A site set to Terra moves to GPT-6 Sol, same provider.
- Unchanged: a site that already runs Unstale keeps the model it had, even if it never saved its settings.
-
Fixed
- The automation no longer buys a new refresh of a post on every run after a failed attempt. It waits 7 days before trying again.
- A refresh you rejected or cancelled now counts as a decision. The automation leaves that post alone until its rule's age delay has passed again.
-
Fixed
- The instruction field of the editor block sits closer to its levels and to its help text.
-
- unstale.ai can now set one cookie, aff_ref, but only if you arrive through an affiliate partner's link and click Accept on the banner shown then. It remembers which partner sent you, for 60 days, so that partner can be paid a commission if you buy.
- Only after Accept, your browser also tells our affiliate service at partners.licenseos.net about the visit, which it counts once per day.
- Refusing, or ignoring the banner, sets nothing and sends nothing, and the site and checkout work the same. Manage cookies, in the footer, deletes the cookie at any time.
- The privacy policy describes all of it in full.
-
- Correction: until today, this privacy policy said the site ran no analytics. In fact, Cloudflare Web Analytics had been added automatically by Cloudflare, our CDN, since at least 11 September 2026. The policy now describes it, what it collects, how long Cloudflare keeps it and how to object.
- unstale.ai measures its audience with Cloudflare Web Analytics, which sets no cookie, stores nothing on your device and does not track you across sites. It produces anonymous, aggregated statistics, for us only.
- You can object at any time from the privacy policy, and the beacon does not load when your browser sends Do Not Track or Global Privacy Control.
-
Fixed
- When you schedule a refresh, page builder posts that are already scheduled are no longer counted as moving to the new date unless you include them.
-
Improved
- Unstale/list-stale-content declares min_age_days as always present, and unstale/estimate-refresh no longer says only published posts can be estimated.
Fixed
- With "Let AI agents approve or reject refreshes" off, an AI agent can no longer cancel a refresh that reaches the review queue during its request.
- For an older job, unstale/get-job returns the stored post content as the original, not a copy altered by display filters.
-
Improved
- The estimate screen shows what including page builder posts adds to the cost, before you tick the box.
Fixed
- A bulk refresh or schedule from Content health no longer fails with "The link you followed has expired" when the selection includes a page builder post.
-
New
- AI agents such as Claude Code, Codex and Hermes Agent can drive Unstale: list stale content, estimate, start, cancel and retry refreshes, and read their fact-check.
- Eight WordPress abilities in an Unstale category, and a dedicated "unstale" MCP server when the MCP adapter plugin is active.
- Settings > Connect an AI agent shows the adapter status and a ready-to-paste configuration for each client, plus an SSH variant.
- Approving or rejecting a refresh stays with a person by default. The "Let AI agents approve or reject refreshes" setting opens it to agents.
- The review queue shows the custom instruction a refresh was started with, above the fact-check.
- A custom instruction attached to a refresh requires Unstale Pro.
-
New
- Give a refresh an instruction of up to 1,000 characters, from the Unstale block of the editor or from an AI agent through the free Unstale abilities. It steers research, rewrite and enrichment.
- The instruction outranks the level's rules on structure, length and tone, never the HTML, the shortcodes, the facts or the web search budget. Fact-check and verification ignore it.
- A retry keeps the instruction. A new, scheduled or automatic refresh starts without one.
- Needs the free Unstale plugin in version 1.24.0 or newer, up from 1.15.0. Update the free plugin first and Pro second; wordpress.org can take an hour longer to propose it.
-
Improved
- The review queue now shows the fact-check above the diff: the outdated facts it found, with their source, and the new figures no source confirms.
-
Fixed
- Publishing a refresh no longer removes scripts, embeds, inline SVG icons, forms or styles from the original post. They come back byte for byte, widgets included.
- When a refresh would lose one of those elements or an original shortcode, Unstale refuses to publish it and leaves the post untouched.
- Restore puts back the content the refresh replaced, even when a cleanup plugin has purged the post revisions, and says so when it cannot.
- A Divi or Elementor page with a script, embed, icon or form inside a text module now stops before any AI call, instead of failing after paid steps.
- Stricter filtering of the model's output before publishing, including markup hidden inside HTML comments.
- A refresh already waiting for review is refused at publication if it lost one of those elements: run a new refresh.
-
Improved
- Those hidden block settings no longer reach the model at any step, so such posts cost a fraction of what they did, and the settings come back byte for byte.
Fixed
- A post whose blocks store large hidden settings, such as widgets from older Travelpayouts versions, no longer fails its refresh with "The answer from the model was cut off at the output limit".
-
Improved
- The estimated costs and the total follow the refresh level picked on the Bulk refresh screen.
Fixed
- The Bulk refresh screen prices the model chosen in Unstale settings. It quoted Claude Sonnet 5 on every site, about fifteen times the real cost on a Gemini 3.8 Flash site.
- A SeedProd page is no longer estimated at zero words on the Bulk refresh screen.
- The refresh level label, menu and Refresh selected button sit on one line, on a phone too.
-
New
- Schedule refresh, in the Bulk actions of Content health, plans a one-off refresh of the articles you picked, on the date and time you choose.
- A scheduled article shows "Scheduled for" its date on Content health, with a Cancel link.
- A scheduled refresh that WordPress runs more than a day late starts nothing, and the article says why.
- Exclude joins Refresh selected in the Bulk actions of Content health, so a whole selection leaves the list in one go.
- Show all puts the whole list on a single page, with your tranche and your search kept.
Improved
- Excluding a scheduled article, or refreshing it from anywhere else, cancels its schedule.
- The title of an article opens its public page in a new tab, on Content health and on Excluded.
-
Improved
- A consolidation from Unstale Pro waits in the review queue even when automatic publishing is on.
- The automatic publishing setting and the block under the editor say that consolidations still wait for your review.
-
Fixed
- With automatic publishing on, the block under the editor and the queued notices no longer promise that the refresh waits for your review.
- The plugin description no longer claims that every figure is checked. The fact-check covers the most important claims, and a second pass checks the figures the rewrite adds.
-
Fixed
- A consolidation saved while a scan or a restore updates the same list at that moment is no longer lost.
- Restoring or publishing a SeedProd page built with Pro blocks updates the cannibalization scan right away, instead of up to 12 hours later.
- A scan that finishes after an article changed no longer serves results computed before the change.
-
Improved
- The card of a consolidated group names the article it was consolidated into, with the date, and keeps that article as the keeper.
- Restoring the previous version of a consolidated keeper forgets that consolidation, so the group is checked afresh.
Fixed
- A group you consolidated no longer vanishes from the scan once the keeper absorbs the other articles, as long as one of them is still published.
- Remembering new consolidations needs Unstale Pro 1.9.0. Update the free plugin first and Pro second.
-
Improved
- With the free Unstale 1.21.0, the Consolidate confirmation and the Automation screen say that a consolidation waits for your review even when automatic publishing is on.
- With an older free plugin, automatic publishing still publishes a consolidation without a review, and the confirmation says so.
-
Fixed
- With automatic publishing on, the bulk refresh notices and the Consolidate confirmation no longer send you to a review that will not happen.
-
Added
- The card of a consolidated group offers to propose retiring its absorbed articles again, after you kept them published or the proposal was lost.
Improved
- Consolidate is hidden on a group whose articles all belong to a consolidation that is already published.
- A Consolidate form left open while those articles were consolidated is refused when submitted, so the same articles are never consolidated twice.
- Consolidations queued from now on are remembered by the free Unstale 1.20.0. With an older free plugin, Consolidate works as before.
-
Improved
- Each AI verdict is kept with its date and survives a page reload, until the group itself changes.
- A group the AI found free of cannibalization shows no keeper, and a failed re-check keeps the previous verdict.
Fixed
- When Confirm with AI keeps only part of a group, the card greys out the articles it left out, marks the keeper the AI chose and says how many it confirmed.
- Consolidating only the confirmed articles needs Unstale Pro 1.8.0. Update the free plugin first and Pro second.
-
Fixed
- After Confirm with AI splits a group, Consolidate offers only the articles the AI confirmed as keepers, and absorbs and proposes to retire only those.
- A group the AI found free of cannibalization no longer offers Consolidate.
- A consolidation form opened before the verdict follows it when submitted: a keeper the AI left out is refused.
- Bounding Consolidate to the AI verdict needs the free Unstale 1.19.0. With an older free plugin, Consolidate works as before.
-
New
- When an article is retired into another one, its URL sends visitors to the article that absorbed it, with a permanent redirect served by the plugin itself. It works the same on Apache, nginx, IIS and LiteSpeed, and nothing is ever written to your .htaccess file.
- A Redirects screen lists those redirects and undoes them, either by removing the redirect alone or by publishing the article again. It appears once the site has at least one.
- A redirect stops firing on its own the moment its article is published again, without you touching anything.
- Retiring an article is done by Unstale Pro 1.7.0. Update the free plugin first and Pro second.
-
New
- When a consolidation publishes, Unstale offers to retire the articles it absorbed. Each becomes a draft, and its URL sends visitors to the article that absorbed it with a permanent redirect.
- The redirect is served by the plugin, so it works the same on Apache, nginx, IIS and LiteSpeed, and nothing is ever written to your .htaccess file.
- Nothing happens unless you click: leaving the offer alone keeps every article published, and nothing is ever deleted.
- An article whose URL cannot be redirected is left published rather than turned into a dead link.
- Undo any of it from Unstale > Redirects, by removing the redirect alone or by publishing the article again.
- Retiring needs the free Unstale in version 1.18.0. Update the free plugin first and Pro second; wordpress.org can take an hour longer to propose it.
-
Fixed
- On a site whose year comes from a date shortcode plugin (Dynamic Month & Year, Runthings, Current Year Shortcode, Shortcode for Current Date, WP Date and Time Shortcode), a refresh could end on "A shortcode placeholder was lost during the rewrite" and publish nothing, after every step had run. The year now travels as the refresh marker instead of a shielded shortcode, and comes back as your plugin's shortcode.
-
New
- A search box on Content health filters the list by title and slug, case and accents ignored, without reloading the page. The age threshold, the tranches, your exclusions and the noindex rule keep their meaning.
Improved
- The meta title and description carry your SEO plugin's current-year variable (Yoast SEO, Rank Math, All in One SEO, SEOPress) instead of a fixed year, at Balanced and above.
Fixed
- On an Elementor page, a style edit made in the builder while a refresh waited for review was undone on approval. Publication now refuses, without writing anything, if the layout changed since the refresh started.
- A refresh that leaves an Elementor, Divi or SeedProd layout unchanged keeps its point of return, which 1.16.0 dropped.
-
New
- Restore the previous version now works on pages built with Elementor, Divi and SeedProd. Each builder records what the refresh is about to overwrite, layout included, and puts it back on click.
Fixed
- On an Elementor page, visitors could see the old text for up to a day after publication. Elementor's element cache is now cleared on every write.
- The restore link and its notices say what will actually be put back on a builder page, and a restore completed halfway is logged and can be tried again.
-
New
- Year references now follow the calendar. "In 2025" or "updated for 2025" reads the current year after a refresh, in the text at every level, in the title and metas at Balanced and above. A year that dates an event stays as it is.
- With a current-year shortcode plugin active, the refresh writes its shortcode instead of a fixed year, only where it has been measured to render. Five plugins are recognised, and the unstale_year_token filter sets your own token per surface.
- The post title is refreshed at Balanced and above, by its year only. The slug never moves, and a title you edited during the refresh is never overwritten.
- Unstale Pro 1.6.0 needs this version. Update the free plugin first and Pro second.
-
New
- Affiliate product boxes on Strong and Maximal. With AffiMax or AAWP active, Pro inserts one box per product the article compares or recommends, as your affiliate plugin's own shortcode, at the end of the section that presents it. Four boxes per article at most, nothing without an affiliate plugin. Filters: unstale_affiliate_plugin, unstale_affiliate_shortcode, unstale_affiliate_max_boxes.
- A second refresh replaces the boxes Pro inserted the first time instead of adding to them. A shortcode you typed by hand is never removed.
- The current-year behaviour of Unstale 1.15.0 applies on Strong and Maximal too, in the title, meta title and meta description.
- Needs the free Unstale plugin in version 1.15.0 or newer, up from 1.9.0. Update the free plugin first and Pro second; wordpress.org can take an hour longer to propose it.
-
Fixed
- A step that failed twice in the same paid way no longer buys a third identical attempt. Failures that cost nothing keep their three tries, and a manual retry always starts with the full budget.
-
Fixed
- A long post could fail its refresh over and over with "The answer from the model was cut off at the output limit". Batches are now sized on what is actually sent, not on a word count that ignored block markup.
- The room allowed for a rewritten batch was shared with the model's thinking. It is now twice as large, at no extra cost.
- Updating Unstale halfway through a long rewrite could publish a post with one passage duplicated and another missing. The rewrite now starts over when the split changed.
-
Fixed
- When the AI found no cannibalization in a group, Content cannibalization said "AI could not confirm this group", which reads as a breakdown. A verdict now reads as a verdict.
- Roughly one verdict in seven was paid for and never delivered, cut short at 1024 output tokens. The room allowed is now four times larger, and the price shown before you click does not change.
-
Fixed
- Confirm with AI answered "This cannibalization group no longer exists" for every group as soon as any post on the site had been saved since the scan. The groups are now recomputed and matched by their posts.
- The Excluded tab listed every item of a content type Unstale never refreshes, one line each. Such types now appear once, with a count, and the count above the list covers only what you can reintegrate.
-
Fixed
- The Consolidate into keeper button answered "This cannibalization group no longer exists" for a group still on screen whenever any post had been saved since the scan. With Unstale 1.14.1 or newer the groups are recomputed and matched by their posts.
-
Fixed
- Confirm with AI answered "AI could not confirm this group" for every group. A 200-token cap cut the verdict off before it began; it is now 1024, and a cut-off answer shows as a failure with its cause.
- The AI check used the catalog's recommended model instead of the one you chose in the settings.
- The cannibalization scan no longer groups content Content health already excludes, noindex pages and posts you excluded by hand. The Pro weekly sweep applies the same rule.
- Titles in the cannibalization cards could show raw HTML entities.
- A server reply that was not JSON, a maintenance page for instance, is reported as a failed request instead of an empty verdict.
-
New
- A notice tells you when your default refresh level is one your plan no longer allows, and what repairs it. Your setting is never rewritten behind your back.
Fixed
- The settings screen shows the refresh level you actually saved, even a locked one, and saving a locked level overwrites nothing.
- A model that leaves the catalog stops the job by name instead of quietly calling another provider.
- The bulk refresh screen stops on a level your plan has locked, instead of blaming your AI provider.
- An Elementor floating button is no longer treated as refreshable content nor picked as an internal-link target. Any content type its developer keeps out of navigation menus is left alone; WooCommerce products stay.
-
Fixed
- The weekly cannibalization sweep grouped content the free plugin already excludes, noindex pages and manual exclusions. It now uses the free plugin's scanner, so the sweep and Content health agree. Needs Unstale 1.14.0 or newer for the exclusions to apply.
-
New
- When the automation queues nothing on a run, a notice says why and links to your settings. A model that has left the catalog, for instance, used to refuse every candidate every night with a counter for its only trace. The notice clears on the first run that queues something.
Fixed
- The run log records what stopped each candidate, grouped by cause.
-
New
- Content your SEO plugin marks noindex is left out of Content health. Read from Yoast SEO, All in One SEO, SEOPress and Rank Math, each measured on a real site; any doubt keeps the page in the list.
- An Excluded tab on Content health lists what Unstale never refreshes and who decided it: a content type with no search surface, a manual exclusion, or a noindex set in your SEO plugin, which is named.
Fixed
- Refusing to refresh an excluded post now points to the posts list, where the Reintegrate link actually is.
-
New
- An Exclude link, next to Refresh, in the posts list and on Content health. An excluded post leaves every list Unstale works from, and a refresh started on it is refused. The link then reads Reintegrate.
Fixed
- Content types with no search surface, Popup Maker popups or Elementor templates for instance, no longer appear as posts to refresh or as internal-link targets. WooCommerce products stay.
- A bulk refresh that refuses a post now says why.
-
New
- A refresh now fact-checks the figures it added itself, at every level, and lists on the review screen the added figures that are outdated or unconfirmed, with a source link. No model is called when nothing was added.
Fixed
- The count of checked facts reads "checked in the original article", with the added figures on their own line below.
- The Journal no longer reports 0 searches for refreshes that did search the web. No provider plugin passes that count on yet, the Journal says so, and the logged cost is documented as a floor.
-
Fixed
- When the catalog replaces a model with a newer one from the same family, your site follows the upgrade, Gemini 3.7 Flash to Gemini 3.8 Flash for instance. A replacement that would change provider is refused.
-
New
- The Unstale block under the editor says, before you start, whether the refresh will move the publish date.
Fixed
- A refresh could change how your article speaks to its reader, informal to formal for instance. Unstale now measures the voice before rewriting and holds every step to it, the meta description included.
- The model catalog records when a model is renamed, so a site that chose Gemini 3.7 Flash keeps its choice and its rate the day it becomes Gemini 3.8 Flash.
-
Fixed
- On Strong and Maximal, a refresh could change how your article speaks to its reader, informal to formal for instance. Pro now holds its four writing steps, meta description included, to the voice the free plugin measures on your original.
- Needs the free Unstale plugin in version 1.9.0 or newer, up from 1.8.0. Update the free plugin first and Pro second.
-
Fixed
- On a site made of short pages, Content health could miss two pages that said the same thing word for word. A pair is now measured against the shorter of the two posts. Long posts score exactly as before.
-
Fixed
- On a site written in Chinese, Japanese, Thai, Lao, Khmer or Burmese, Content health found very few competing posts. The comparison now switches on the writing system itself, at any length. Korean and every spaced language are unchanged.
-
Fixed
- On Content health, a group of more than 25 posts sharing a vocabulary is a template, never sent to the AI pass. It said "AI could not confirm this group"; it now says the pages share a layout and that no model was called.
-
New
- Content health now finds published posts that compete over the same topic, grouped with the post Unstale would keep and why. It runs on your own site, with no AI provider and at no cost. An optional AI pass, priced before you start, tells shared vocabulary from a shared query.
- If you use Unstale Pro, groups found by its weekly sweep now show on this screen too. Needs Unstale Pro 1.3.0 or newer.
-
Fixed
- A weekly sweep that stopped before the end of your site still published its partial results as if they were complete. The sweep now reports it, and Content health says the list is incomplete.
- The notice counting posts with too little distinctive text now says they cannot be matched at all, even against an identical copy. They are still compared, as before.
-
New
- Pro sweeps your whole site for posts that compete over the same topic, once a week, in batches in the background, on your own server and at no cost.
- A group the sweep has never reported before is announced on the Unstale screens, with a link. Never the same finding twice.
- A Consolidate button on each group queues a refresh on the post Unstale would keep, fed with what the other posts cover. Nothing is deleted or redirected, and the result lands in your review queue.
- Needs the free Unstale plugin in version 1.8.0 or newer, up from 1.6.0. Update the free plugin first and Pro second.
-
New
- Pro carries its own icon on the WordPress updates screen, the free plugin's mark with the dot replaced by a star.
Fixed
- That screen said "Compatibility with WordPress 7.1: Not tested" under Pro. The tested version now reaches WordPress, along with the WordPress and PHP versions Pro requires.
- Both show from your NEXT update, since WordPress builds the notice with the version you already have.
- Needs the free Unstale plugin in version 1.6.0 or newer, unchanged from 1.1.0.
-
New
- A Get started screen, opened on first activation, lists the five posts that have gone longest without an update and queues all five in one click, through the usual estimate screen. It stays in the Unstale menu.
-
New
- The quiz added by Strong and Maximal is now something a reader plays: each answer stays folded until asked for, and Pro says whether the choice was right, keeps a score and opens the explanation.
- The fold is plain HTML, so the quiz keeps working with Pro switched off, expired or deleted. Only the scoring goes with the add-on.
- Articles refreshed before this version keep the quiz they were published with; the new one arrives with their next Strong or Maximal refresh.
- Needs the free Unstale plugin in version 1.6.0 or newer, unchanged from 1.0.4.
-
New
- A Restore button in the Unstale block puts a post back as it was before its refresh: text, publish date and SEO metas, field by field, and only what the refresh changed.
- A notice across the admin when refreshes are waiting for your review.
- The Unstale column in the posts list colours the age of the last refresh, on the same thresholds as Content health.
- An Export CSV button on the Journal, carrying the current filter.
- The refresh level slider in Settings shows what each level costs per 1,000 words, Pro levels included.
-
New
- With Unstale Pro 1.0.3 or newer, the Unstale block under the editor says what the automation decides for the open post, and warns when a rule excludes it.
-
Fixed
- Twelve strings had never reached the translation catalogue, among them everything the editor block says about automation rules and the support section of the Licence screen.
- Needs the free Unstale plugin in version 1.6.0 or newer, up from 1.1.2, in line with the free plugin actually supported. Update the free plugin first and Pro second.
-
New
- The Unstale block under the post editor says what your automation decides for the open post: the governing category rule, its level, and when the next scheduled pass runs.
- That block warns when a rule EXCLUDES the post from the automation, names the category and links to the rules screen.
- Needs the free Unstale plugin in version 1.5.1 or newer; on an older one the block looks exactly as it did.
-
New
- An Unstale block under the post editor, in both editors. Pick a level, start the refresh and follow it step by step without leaving the page.
- Once a refresh is ready, that block lists everything it did: length change, corrected facts and their sources, metas, structured data, internal links and inserted blocks.
- On the free plugin, picking Strong or Maximal shows what that level would add to the open post, without inventing numbers.
-
Fixed
- On Content health, posts never refreshed carried an empty line in their Unstale cell, stretching every row of a fresh install.
-
New
- With Unstale Pro, its licence key field now also appears in Unstale > Settings.
Fixed
- The bundled model catalogue still expected Claude Sonnet 5 to get more expensive on 1 September. Anthropic made its $2 / $10 per million tokens permanent on 10 August.
-
Improved
- The cost question in this readme gives the real range across the catalogue.
Fixed
- On a site using All in One SEO, a refresh wrote its title and description where nothing read them. Unstale now writes through AIOSEO's own interface.
- The cost announced on Google models was about fifteen times too high: search results are not billed as input tokens there, and the free monthly search allowance is now counted. On a 500-word article at Balanced, 24 cents became 4.
- Elementor, Divi and SeedProd pages no longer raise a page builder warning. It is kept for builders without an adapter, and says what would really happen.
- A builder section holding a script or style block could carry that code into the rewritten text.
-
New
- Your licence key can be entered from Unstale > Settings, next to the refresh levels it unlocks, as well as from the Licence menu. Needs the free Unstale plugin in version 1.4.1 or newer.
-
Fixed
- On PHP 8.1 the plugin did not work at all, one file using syntax that only exists from PHP 8.2. Nothing changes on PHP 8.2 or later.
-
Improved
- When a refresh updates a SeedProd page inside the builder but not the live page, the journal says so and names the one step left: open the page in SeedProd and save.
-
New
- Pages built with SeedProd can now be refreshed, layout, styling and images untouched. Elementor and Divi were already supported.
- On SeedProd pages using SeedProd Pro blocks, the new text lands in the builder but the live page keeps its text until you reopen it in SeedProd and save.
-
New
- Pages built with Elementor or Divi can now be refreshed. Only the text goes through the refresh; layout, styling and settings stay as they were. An unsupported builder is flagged before anything runs.
- Shortcodes are lifted out before the rewrite and put back afterwards, exactly as they were.
- SEOPress is detected like Yoast, Rank Math and All in One SEO.
Improved
- An unreadable model answer is quoted at both ends in the journal, not just its first 300 characters.
- A builder field holding a structure rather than plain text is left alone instead of being replaced by the word "Array".
- The word count used to size a refresh no longer counts shortcode markup.
Fixed
- A long article could be published with a hole in the middle when the model cut a batch short. A cut-off answer is now refused and retried.
- A SeedProd page built from a theme template was not recognised as a builder page, and its refresh was lost.
- An Elementor or Divi page containing anything shortcode-shaped failed at the publishing step every time.
- The guard against overwriting an edit made while a job waited in the review queue was switched off on Elementor and Divi pages.
- Backslashes in your content were dropped on publication.
-
New
- After two weeks of real use and at least three published refreshes, Unstale asks for a review on wordpress.org, on its own screens only. "Do not ask again" means exactly that.
-
Fixed
- Refreshing a post a second time no longer stacks a second set of key-takeaway boxes on the first.
- The key-takeaway boxes are valid blocks wherever they come from, so an add-on can add its own without the editor flagging the content.
-
New
- The Licence screen shows where to reach priority email support. Without an active licence it points to the free plugin's public forum.
-
- First release. Strong and Maximal levels, scheduled automation, per-category rules, bulk refresh, licence activation and in-place updates.
- Requires the free Unstale plugin in version 1.1.2 or newer.
-
Added
- Two filters (`unstale_prompt`, `unstale_rewrite_prompt`) so an add-on can serve its own system prompts.
-
New
- A Content health screen lists the published content you have not touched in a while, oldest first, in three age ranges. It reads only your database and works with no AI provider connected.
- Select several items there and send them in one batch, capped at 50, with the total cost shown before anything starts and every left-out item named with its reason.
- A setting decides how long content has to sit untouched before it counts as stale, 180 days by default.
Improved
- Up to 15 internal links per refresh, instead of 10.
-
Improved
- The review queue compares the text your readers see, not the block markup. On a real refresh the comparison went from 100 rows to 31.
- At Balanced, a dense paragraph hiding a series of steps or figures is restructured into a list or a table.
- The comparison heading names the level that produced it.
Fixed
- The boxes added by the enrich step were plain HTML between two blocks, which the editor reported as invalid content. They are now regular blocks.
-
Fixed
- On a long article, the metas and structured data step could hit the output limit mid-answer and retry under the same limit. The limit is now high enough, and a cut-off answer says so in the journal.
-
Fixed
- A refresh could die on an article with nothing to fact-check, the model's reply being written in a way the plugin could not read. Those answers are now understood.
-
Fixed
- A model answering with reasoning only killed the refresh outright. It is now treated like any other step failure: logged, counted in the cost, and retried.
-
Fixed
- The cost shown could be lower than what your provider billed, a failed step dropping the tokens it had spent. Every call that reaches the provider is now counted on its own line.
- The journal quotes what the model actually sent back when its answer could not be read.
-
Fixed
- A refresh that died mid-step always reported the same generic reason. The journal now records what the worker actually reported.
-
Fixed
- A refresh could fail for good during a short provider outage, all three attempts falling inside 90 seconds. Retries are now spaced 2 and 10 minutes apart.
-
First public release of the free plugin on the wordpress.org plugin directory.
Added
- Bring-your-own-key on the WordPress AI Client: you connect Anthropic, OpenAI or Google in Settings > Connectors, WordPress holds the key, and no content and no key ever reaches an Unstale server.
- Four refresh levels behind a single slider. Minimal and Balanced are free; Strong and Maximal unlock with Unstale Pro.
- Refresh pipeline: analysis, live web research, fact-check of figures, prices and dates, rewrite, enrichment (metas, JSON-LD, key-takeaway callouts), internal linking and cleanup.
- Internal linking with up to 10 relevant links per refresh, varied anchors, one link per target page, and no forced links when nothing relevant exists.
- Review queue with a side-by-side diff and approve, reject, cancel, retry and unstick actions. Full-auto publishing is available but off by default.
- SEO-safe republication: the post URL, slug and native revision history are preserved, with an optional date bump, position control, randomised timing and allowed days and windows.
- Dated-permalink safety: the date bump is skipped automatically on core date-based structures, and the %unstale_year%, %unstale_monthnum% and %unstale_day% tags freeze the original date in the URL. Deactivation restores the core tags.
- Cost estimate shown before every run, per article and per batch, plus a journal recording every step, web search, token count and real cost.
- Unstale column in the post list with status, last refresh and a one-click refresh action.
- REST API (unstale/v1) and WP-CLI (wp unstale refresh) for automation.
- Remote model catalogue fetched once a day and cached for 48 hours, with a bundled fallback, so new models and new provider rates appear without a plugin update.
- Gutenberg and Classic editor support on posts, pages and public custom post types, with a targeted cache purge (URL, home and feeds) instead of a full flush.
- Complete internationalisation from day one: text domain unstale, POT file shipped, en_US default.
Version numbers follow semantic versioning: a major bump means a breaking change to the REST API or the WP-CLI commands, a minor adds features, a patch fixes bugs. The plugin readme carries the most recent entries of this log inside your WordPress admin.