=== Ariadne Related Posts – Smart Content Recommendations ===
Contributors: uosamuel
Tags: related posts, internal linking, content recommendations, read next, engagement
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.9.64
License: GPL v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Show related posts under every article, matched by shared tags, categories, title words and text. Runs on your own server with no API key.

== Description ==

Ariadne Related Posts shows readers the posts closest to the one they are reading, so they click through instead of leaving. It matches posts by what they really share (tags, categories, title words and the text itself), not just by sitting in the same category.

The free version works on its own, on your own server. There's no API key, no account and nothing to set up. Activate it, and related posts with thumbnails appear under your articles.

= Why site owners use it =

* **More page views per visit.** Readers who finish an article get a short list of what to read next.
* **Automatic internal links.** Each suggestion is a normal link, so older articles keep getting found by readers and search engines.
* **Fast on any host.** Lists are worked out in the background when you save a post, never while a page loads. It works with full-page caching and busy sites.
* **Clear about what it does.** Each post's edit screen shows its related list and the score behind each match.

= Free features =

* Auto-insert under your post content, with featured-image thumbnails.
* Or place the list yourself with the block, the `[ariadne_related]` shortcode or a widget. Change the heading or count for one spot.
* Smart matching on shared tags, shared categories, title words and full-text similarity. Change how much each one counts.
* **Up next**: a link to one more article that appears once a reader is about 60% through a post. It's a slim bar on phones and a small card on desktop. Choose its size, colors (including a frosted glass style) and the details it shows. It is a real link that search engines can follow, and it never shifts the page.
* A Dashboard, a Settings screen and a Post Status screen, with light and dark modes.
* Choose which user role can view the reports.
* Works with any theme. Turn off the plugin's own styles if you want to style it yourself with WordPress's Additional CSS.

= How matching works =

Each post gets a score against every other post from four local signals:

* **Shared tags**: a capped, diminishing-returns overlap score.
* **Shared categories**: the same capped-overlap formula, separate from tags.
* **Title overlap**: Jaccard similarity of title words, with common words removed.
* **Text similarity**: BM25 scoring of each post's body text, computed and cached on your own server.

Background jobs keep every list up to date in small batches. They carry on by themselves without waiting for site traffic, so a large site finishes its first pass promptly even when it's quiet.

= Pro & Pro+ =

Pro adds AI matching with Voyage AI embeddings, which understands what a post is about rather than only the words it shares. It's blended with the free text signal using Reciprocal Rank Fusion. Pro also adds related products for WooCommerce and other post types, full style control with a card style picker, manual pin and exclude, Cornerstone Posts, choosing the exact paragraph the block appears after, and a live preview that scores an unsaved draft.

Pro+ adds related-post boxes placed naturally inside the article body, settings export and import, and WP-CLI. See the in-plugin pricing page for the full list.

= Docs and support =

* Plugin homepage: [uwawp.com/ariadne](https://uwawp.com/ariadne/)
* Docs and guides: [uwawp.com/docs](https://uwawp.com/docs/)

== Installation ==

1. Upload the `ariadne-related-posts` folder to `/wp-content/plugins/`.
2. Activate the plugin through the "Plugins" screen in WordPress.
3. Visit Settings → Ariadne Related Posts to adjust scoring weights, or just leave the defaults — it works immediately with zero configuration.

== External services ==

This plugin's own scoring and matching (tags, categories, title overlap, local BM25 text matching) runs entirely locally — no data leaves your site for that. It uses the Freemius SDK for licensing, and two optional pieces load an external resource, under the conditions below:

**Freemius (licensing)** — this plugin uses the Freemius SDK to manage plugin updates and Pro/Pro+ license activation. It contacts the Freemius API (`api.freemius.com`) to check your license status and deliver updates; on activation, Freemius shows its own opt-in screen asking permission before any anonymous, non-personal diagnostic data (e.g. site URL, plugin/WordPress/PHP versions) is shared — this is optional and declining it does not affect the plugin's functionality. See Freemius's Privacy Policy: https://freemius.com/privacy/ and Terms of Service: https://freemius.com/terms/

**Google Fonts (Pro/Pro+ only)** — this plugin's own Dashboard, Settings, and Post Status admin screens use your system's font — nothing is requested from Google for those. Separately, if a Pro/Pro+ license is active and a site owner selects one of the curated Google Fonts for the related-posts card styling (Customizer), that one font family is requested from Google's font CDN (`fonts.googleapis.com`) on your site's frontend. No data beyond the standard browser request (e.g. IP address, user agent) is sent to Google. See Google's Privacy Policy: https://policies.google.com/privacy and Google Fonts' own privacy FAQ: https://developers.google.com/fonts/faq/privacy

**Voyage AI (Pro/Pro+ only)** — if a Pro/Pro+ license is active and a site owner has entered their own Voyage AI API key, this plugin sends each post's title and body text to the Voyage AI API (https://voyageai.com) once, when that post is saved and its content has changed, to compute a semantic-embedding vector used for the AI-matching signal. This is entirely opt-in (no key = no calls) and uses the site owner's own account and key, not a shared or plugin-provided one. See Voyage AI's Terms of Service: https://www.voyageai.com/tos and Privacy Policy: https://www.voyageai.com/privacy

== Frequently Asked Questions ==

= How is this different from showing posts from the same category? =

Category-only plugins treat every post in a category as equally related. Ariadne scores each pair of posts on shared tags, categories, title words and text, so the closest matches come first. You can see the score for each match on the post's edit screen.

= Does it work with caching plugins? =

Yes. Related lists are stored with each post and read from that store when the page is built. Nothing is calculated during the page load, so it works with full-page caching, object caching and CDNs.

= I'm switching from another related posts plugin. What do I need to do? =

Deactivate the old plugin and activate Ariadne. It builds related lists for your published posts in the background, and the Dashboard shows its progress. If you placed the old plugin's shortcode by hand, replace it with `[ariadne_related]` or the block.

= Does this call any external service? =

Not in the free version. Every signal (tags, categories, title overlap, and local BM25 text matching) is computed locally, with no external API calls, no account, and nothing to configure. Pro adds an optional AI-powered semantic-matching signal, which does call a third-party API (Voyage AI) using your own API key — entirely opt-in, and the plugin works fully without it.

= Does this slow down my site? =

No. Nothing is ever scored at page-render time. Every related-post list is precomputed in the background (in small, budgeted batches) and simply read from a cache when a page loads.

= Can I control where the related-posts block appears? =

Yes — auto-insert after your content, or place it yourself anywhere with the `[ariadne_related]` shortcode, the Gutenberg block, or a widget. (Pro adds choosing the exact paragraph it lands after, and Pro+ adds boxes placed naturally inside the article body.)

= What happens to my settings if I downgrade from Pro/Pro+? =

Nothing is lost. Anything that depends on a Pro/Pro+ feature (custom styling, pinned posts, etc.) simply stops being applied while locked — the underlying data stays saved, and everything picks back up automatically if you upgrade again.

== Screenshots ==

1. Dashboard: getting-started steps, system health and background job progress at a glance.
2. Settings, General tab: auto-insert, how many posts to show, and reporting access.
3. Post Status: the matching status of every published post, with quick filters.
4. The list on the front end, with thumbnails, added under the article content automatically.

== Changelog ==

= 1.9.64 =
* Changed: the plugin is now called "Ariadne Related Posts – Smart Content Recommendations" in the Plugins list and on WordPress.org. Nothing else about it changes.
* Changed: rewrote the plugin description, tags and FAQ in plainer language, and fixed a screenshot caption.

= 1.9.63 =
* Changed: the Dashboard, Settings and Post Status screens have a new glass look: soft color in the background, frosted cards, pill tabs and round buttons. Every setting, button and report works as before.
* Changed: the Dark mode button is now an Auto / Light / Dark switch. Auto follows your admin colors, so it turns dark under a dark admin theme such as Mawu Dark Mode. Your choice is saved in your browser.
* Changed: these screens now use your system's font instead of the bundled DM Sans file. Nothing is downloaded for them.
* Improved: text, borders and focus rings on these screens meet WCAG AA contrast in light and dark, and states such as "Healthy" or "Needs update" are spelled out, not shown by color alone.
* Improved: the screens respect "reduce motion" and "reduce transparency" settings, and use less blur on phones.
* Changed: the post edit meta box uses the same colors, round badges and buttons.
* Added: the Customizer's Ariadne settings now also show on Settings, in new tabs: Card design, Inline box (Pro+), Up next, and Links & styles. They are the same settings, so a change saved on either screen shows on the other. Each section has an "Open in Customizer" link for the live preview. Fields that only matter for another choice show and hide as you change it.

= 1.9.62 =
* Changed: Up next now always links to the post's best related match. The inline boxes and the Related Posts block share the rest of the related list and skip that post, so it never shows twice. Before, when a page already showed every related post, Up next fell back to the nearest post in the same category, which was often not related.
* Added: Up next "Phone style". Phones can show the floating card from desktop instead of the full-width bar. The card keeps a small gap from the screen edges, uses the desktop card size and details, and has a large close button. On a phone held sideways it drops the category, excerpt and dates to stay short.
* Added: Up next "Glass see-through", shown when the glass look is on. Choose Frosted, Standard, Clear or Extra clear. Clearer levels blur the page behind less, and dim or soften it, so text stays readable over any picture.

= 1.9.61 =
* Added: Up next. Once a reader is about 60% through a post, a link to the next article appears: a full-width bar on phones, a small card in the corner on desktop. It links to the best related post the page doesn't already show (in the Related Posts block, an inline box, a shortcode or a widget). If all of them are shown, it picks the nearest post in the same category that isn't, and only repeats a post when nothing else is left. Off by default; turn it on under Appearance → Customize → Ariadne Related Posts → Up next.
* Added: Up next options: when it appears (after the reader is a chosen share of the way through the article, 10% to 95%, or as soon as the page loads), separate sizes for the desktop card and the phone bar (small to extra large), colors (match the reader's device, light or dark), a glass look you can turn on or off, and which details show (featured image, category, excerpt, published and updated dates). The picture can sit as a rounded square or run edge to edge along the side of the card or bar.
* Added: Up next search and accessibility options: a custom label, keeping it out of search result snippets (on by default), rel="nofollow" (off by default), the slide-in animation, a screen reader announcement, and staying closed for the rest of the visit. It is a server-rendered link, never shifts page content, closes with Escape or a labelled close button, respects reduced motion and reduced transparency, and leaves room for the phone's home bar.
* Added (Pro): Up next placement. The bar can sit at the top or bottom of phone screens, and the card at the bottom left, center or right on desktop.
* Added (Pro): a glass text panel for the "text on image" card style, and a Glass cards preset in the card style picker. The frosted panel stays dark enough for white text to stay readable on any photo.

= 1.9.60 =
* Updated Freemius SDK to the latest version.

= 1.9.59 =
* Improved: with Mawu Dark Mode active, Ariadne's Dashboard, Settings and Post Status screens open in dark mode straight away, in your Mawu theme's colors, instead of flashing white first. Your own light/dark choice from the toggle still wins.

= 1.9.58 =
* Added: a "text on the image" card style. The picture fills the card and the title sits on a soft dark fade over it, in Grid, Row and List (as a wide banner). Choose "Behind the text" under Image position.
* Added: a card style picker at the top of the Related Posts Customizer section, with a small preview of each look (Classic cards, Text on image, Wide banners, Scrolling row, Compact list, Numbered list). One click applies the style; every setting stays editable after.
* Removed: the "Copy settings from" control in the Customizer. The style picker replaces it.
* Added: Settings → Matching → "Pause background jobs", on every plan. It stops the background batches, for example during a large import, and picks up where they left off when turned off.
* Added: a daily limit for Voyage AI requests (Settings → AI & API). When it is reached, AI summaries wait until the next day.
* Added: a Site Health check. If the site's background requests to itself are blocked (by a firewall, a security plugin or a site password), Site Health and the Dashboard now say so. Developers can add login headers with the `ariadne_cron_loopback_args` filter.
* Improved: a failing Voyage AI key or a rate limit no longer retries every few seconds. The job waits longer after each failure (up to an hour), and the Dashboard shows why it is waiting and lists recent errors. A post that fails three times is skipped until it is saved again.
* Improved: the same background job can no longer run twice at once, and each batch stops after 20 seconds or near the server's memory limit, so a slow host doesn't kill a batch halfway.
* Improved: the AI usage chart covers up to 90 days, shows days without calls as zero, shows token counts, and only compares with the previous period when that whole period has data. A second daily snapshot no longer overwrites the first.
* Improved: unpublishing a post now removes it from other posts' related lists straight away, and those lists are refilled. Its AI data is kept, so republishing doesn't cost another AI request.
* Improved: when a post's related list changes in the background, that page is cleared in common page-cache plugins (LiteSpeed, WP Rocket, W3 Total Cache, WP Super Cache, SiteGround, Cache Enabler, FlyingPress, WP Fastest Cache). The `ariadne_related_updated` action fires for any other cache.
* Improved: faster pages. Related cards load their data in a few queries instead of several per card, and the front-end stylesheet ships minified (about 4 KB instead of 18 KB sent).
* Fixed: the Numbered list style showed the number above the title instead of beside it.
* Fixed: a post restored from the trash as a draft was counted in text matching before it was published again.

= 1.9.57 =
* Fixed: an edited post kept its old AI (Voyage) embedding. The background job only re-checked the 300 oldest-embedded posts for changes, so on any site past about 300 posts, an article edited after its first embedding was never re-embedded, and Pro matching slowly drifted. The job now finds every post whose content or AI model changed since its embedding was built, directly, including posts edited before this update.
* Fixed: excluding an author, or changing the candidate gates, the candidate pool cap or the enabled content types, only affected lists computed afterward. Existing related lists kept the old results until each post happened to be saved again. These changes now queue a background recompute, the same as a matching-weight change.
* Fixed: on the Free plan, and on Pro sites without a Voyage key yet, the Dashboard permanently reported AI data as missing ("AI Summaries 0 / N", "Attention", a "Run again" button that did nothing, and "Missing summary" on every Post Status row). AI-only rows, the usage chart, the embedding job, and the AI columns, filters and actions now only appear where AI matching can actually run. The embedding job also no longer runs at all without a key.
* Fixed: the default "Related Posts" and "Related" headings were saved as literal English text, so they never translated on non-English sites. Empty now means "use the translated default", and sites still holding the old English default get the translation automatically.
* Fixed: the AI & API settings tab showed editable model and key fields on plans where AI matching isn't included. Those fields now appear only once AI matching is available.
* Fixed: turning on auto-insert for the first time needed two saves, because the toggle stayed disabled until the Settings form had been saved once. It is now always available, with a note pointing to the Matching choices that are saved with it.
* Fixed: Customizer links from Settings and the Dashboard opened on the homepage, where the block never renders, so the live preview showed nothing. They now open on your newest post. The Dashboard also gains a Link Behavior shortcut, and the Advanced shortcut's description is corrected.
* Improved: related-post images now use a properly sized source with srcset (and decoding="async") instead of a stretched 150px thumbnail, so they stay sharp in wider card layouts and on high-DPI screens. Images found in post content use their attachment's sizes too, instead of the full original upload.
* Improved: placeholder tiles for posts without an image use a new 10-color palette where every color meets WCAG AA contrast with its text (four of the old eight colors failed with white text), and skip short words like "A" or "to" when picking initials.
* Improved: with no accent color chosen, accent-colored text (category label, text-link button, numbered list, title hover) now uses the text color instead of a faint 30% grey, and filled badges and buttons use a dark fill with white text. Muted meta and excerpt text is a little stronger so it meets contrast guidelines on common themes, and becomes fully opaque when you pick a meta color.
* Improved: accessibility. Related-post cards now have a visible keyboard focus outline, screen readers hear each title once instead of three times, and numbered badges are announced as "Rank N".
* Changed: the plugin no longer adds a page-wide color-scheme meta tag on posts with related posts. It changed the whole page's form controls and scrollbars for readers in dark mode. Sites that relied on it can restore it with the new `ariadne_color_scheme_meta` filter.
* Internal: removes leftover scheduled events and an option from the earlier arp_ to ariadne_ rename (one of those events had been firing daily with nothing to run), fixes the Customizer group dividers, and fixes the WP-CLI examples, which said `wp arp` instead of `wp ariadne`.

= 1.9.56 =
* Fixed: the two new "Related Posts" link-behavior options added in 1.9.55 (rel="nofollow", open in new tab) were placed inside the same Customizer section as the block's Pro-only style controls, so — despite being intended as free, unconditional settings — they weren't actually reachable without a Pro license. Moved to their own always-available "Related Posts: Link Behavior" section. Found via a real WordPress.org compliance pass against the downloaded free-build zip, not by re-reading the source.

= 1.9.55 =
* Added: a public `ariadne_related_post_ids` filter — `apply_filters( 'ariadne_related_post_ids', array $post_ids, int $post_id, int $count )` — lets a theme or another plugin see and adjust the final related-post list before it displays. Also adds a matching `ariadne_get_related_post_ids( $post_id, $count = 0 )` function for reading that same (already-filtered) list directly.
* Added: link attribute controls for the Related Posts block and the Inline Related Post feature (Customizer, free on every tier) — an option to add `rel="nofollow"` to related-post links, and an option to open them in a new tab. Opening in a new tab always adds `rel="noopener"` automatically alongside whatever nofollow is set to, regardless of tab setting.

= 1.9.54 =
* Confirmed: fully compatible with WordPress 7.1.2 — verified admin pages, Customizer registration, the Related Posts block, REST routes, and a real post save/scoring pass all run clean with no errors, warnings, or deprecation notices.
* Fixed: several CSS selectors (the Related Posts card image, and the Inline Related Post's label and image) shared the exact same specificity as an ordinary theme rule — e.g. a theme's own `.prose img { height: auto }` — so which one won a property like `height: 100%` came down to stylesheet load order rather than always favoring this plugin's own styling. A theme rule loading after this plugin's could silently win that tie, most visibly making the Related Posts card image fall back to its default square shape and spill down over the title below it. Every affected selector now includes its real, always-present wrapper element in the selector itself, so this plugin's styling always outranks a same-shape theme rule regardless of load order.

= 1.9.53 =
* Fixed: BM25 lexical scoring and the AI embeddings signal each pulled a candidate batch's postmeta via `update_meta_cache()`, which caches every meta key WordPress finds for those posts — including the (often large) stored embedding vector, even for the BM25 pass that never reads it. Both now fetch only the specific meta key each signal actually needs, directly. On a real load test this cut scoring time for a 500-candidate pool from ~1.5s to under 250ms for BM25, and removed multi-second variance from the embeddings pass.
* Fixed: publishing or updating a post could take multiple seconds longer than necessary, because the background-job "nudge" (a small internal request that keeps the sweep/backfill queue moving without waiting for site traffic) was sent synchronously in the middle of the save, and measured taking about a second per attempt in some environments — up to twice per save. It's now deferred to run after the response has already been sent, and multiple nudges queued during one request are combined into one. A real bulk-import load test showed per-post save time drop by roughly 70% after this change.

= 1.9.52 =
* Fixed: the Description, Pro & Pro+, External Services, and FAQ sections of this readme misattributed local BM25 text matching to Pro — it's a free-tier signal and always ran locally regardless of license; only the AI (Voyage) embedding signal and its Reciprocal Rank Fusion with BM25 are actually Pro.

= 1.9.51 =
* Fixed: a duplicate `.arp-info-icon`/`.arp-info-tooltip` CSS rule from the 1.9.49 System Health tooltips was overriding the original definition already used by the Settings page's "Why is this locked?" tooltips — merged back into one shared, corrected rule (outline instead of filled, properly centered glyph) so both places benefit consistently.
* Fixed: a two-word System Health row name (e.g. "New Matches") could wrap to two lines at some content widths, which pushed the tooltip "i" icon down to sit between the lines instead of beside the first one. The icon now stays pinned to the first line regardless of wrapping.

= 1.9.50 =
* Changed: "New Matches" row's tooltip now says "...because a new post matched them" instead of "...because something new matched them."

= 1.9.49 =
* Added: "New Matches" row on the Dashboard's System Health panel — reports when a newly-saved post discovers a match with an older post and queues that older post for a refresh, with a count and "how long ago." Reuses the existing job-throughput log, no new background job.
* Changed: "Related Post Lists" renamed to "List Freshness" — the old name read as "has related posts" when it actually means "is the computation current."
* Changed: every System Health row's explanation moved from a description under the name to a hover/focus "i" tooltip — outline style, properly centered.
* Removed: the "Background Processing" row — redundant with the page's own "Background Jobs" section just below it, which already shows the same information per-job with real Last run/progress/manual-trigger detail instead of one aggregated Active/Idle state.

= 1.9.48 =
* Added: "Edge-to-edge image" option for the Inline Related Post card (Customizer → Inline Related Post → Image) — the thumbnail bleeds to the card's own left edge instead of sitting inset, matching the card's corner radius. Mirrors the main block's existing edge-to-edge feature (top-bleed for a vertical card), adapted for Inline's horizontal row. Only offered for the Card/Boxed styles with a Square image shape.

= 1.9.47 =
* Added: "Getting started checklist" toggle (Settings → General, free) — the only thing controlling whether the Dashboard's onboarding checklist shows at all. On by default; stays visible whether or not the steps below it are finished, until a site owner turns it off.
* Changed: dropped the checklist's "Pick a layout" step — whether the Customizer's layout setting differs from its default ('row') isn't a reliable signal of intent, and read as a false "not done" on a Pro site that simply hadn't changed it yet.

= 1.9.46 =
* Added: a "Getting started" checklist on the Dashboard for first-time setup — reviewing the candidate pool, turning on auto-insert, setting the post count, and (Pro) picking a layout or adding a Voyage AI key. Every step reflects real settings state, not a separate dismissal flag, and the whole card disappears once the required steps are done.

= 1.9.45 =
* Added: "Content priority" (Settings → General, free) — controls the priority of Related's own `the_content` filter, for coexisting with another plugin that also inserts content into posts this way (e.g. an ad-insertion plugin). Distinct from "Custom ad-hook name," which is for a theme's own dedicated ad-placement hook outside the_content entirely.

= 1.9.44 =
* Changed: "Posts to show" (how many related posts the block displays by default) is now a free setting on the Settings → General tab — previously only adjustable via the Customizer's Pro-only Related Posts section, with no free-tier way to change the site-wide default (a post's own per-post override was already free, just not the global default).

= 1.9.43 =
* Added: a thin inline progress bar on each System Health row that represents a genuine percent-of-total metric (AI Summaries, Related Post Lists, AI Matching) — color always matches that row's own status pill, never a separate palette.
* Fixed: the Dashboard's Refresh button had no dedicated styling and fell back to wp-admin's default blue-accented button, clashing with the purple pill-shaped Dark mode toggle right next to it. Now styled as the same pill family.

= 1.9.42 =
* Changed: Dashboard's System Health/AI Usage row now gives the usage chart more visual weight relative to the health list, instead of an even split.
* Added: a "Cornerstone Posts" report on the Dashboard — how many posts are currently pinned to always appear as related content sitewide, and a list of which ones, each linking to its edit screen.

= 1.9.41 =
* Changed: every enqueued script/style handle (`arp-admin`, `arp-style`, `arp-blocks`, etc. — 11 handles, 19 registration/reference sites) was still the old short prefix; renamed to `ariadne-*` for the same WordPress.org naming-uniqueness reason as v1.9.38's function/class/option rename. No visible change — same files, same behavior, just how they're registered internally.

= 1.9.40 =
* Fixed: the fix in 1.9.38 that stopped discarding a downgraded site's saved style settings also accidentally removed the license check on the actual Google Fonts CDN request — a downgraded site now correctly keeps its stored font choice in its own card CSS without pinging Google's servers for it, matching this readme's own "Pro/Pro+ only" disclosure again.
* Changed: two more admin page slugs (Settings, Post Status) were still the old `arp-`-prefixed names; now consistent with the rest of the v1.9.38 rename.

= 1.9.39 =
* Fixed: a stale shortcode example in this readme still showed the old `[arp_related]` name — now `[ariadne_related]`, matching what's actually registered.
* Changed: the admin menu slug and Freemius menu config were the last two leftover `arp-`-prefixed identifiers from the v1.9.38 rename; now `ariadne-dashboard`.

= 1.9.38 =
* Fixed: a locked/downgraded site's related-posts styling and Google Fonts selection were silently discarded and replaced with defaults at render time regardless of what was actually saved — settings are always honored now; only the Customizer controls to change them stay Pro-gated.
* Fixed: this readme's Voyage AI Terms/Privacy links (voyageai.com's bare domain now redirect-loops; switched to www.voyageai.com).
* Changed: internal function/class/option prefix renamed for WordPress.org's naming-uniqueness guideline. Existing installs migrate settings, post data, and the internal cache automatically on upgrade — nothing user-facing changes.

= 1.9.34 – 1.9.37 =
* Fixed: narrow-width panel spacing on Dashboard/Settings/Post Status; an int cast before a display value; a tier-check helper failing open for an undefined key; tightened settings-import file validation.
* Added: this readme's External Services section now discloses the Freemius SDK's own license/update-check calls; bundled the DM Sans font's OFL license text.
* Changed: trimmed the header description; made a Preview panel help line tier-aware; internal build-hygiene follow-ups (no functional change).

= 1.9.33 =
* Added: Post Status now has a combined "Status" column (Healthy / Needs update / Missing summary / Not using AI) and one-click filter shortcuts above the existing detailed filters.

= 1.9.31 – 1.9.32 =
* Changed: the Dashboard's Overview KPI row was folded into System Health (it repeated the same signals a second time); dark mode's card borders are now a soft translucent highlight; several mobile-width layout gaps fixed.
* Fixed: a "Quick Settings" card could link into a Customizer section unavailable on the current plan — a locked card now shows its required tier and links to upgrade instead.

= 1.9.29 – 1.9.30 =
* Changed: Dashboard redesigned around what actually needs answering (health, attention, AI/API usage, background activity, configuration). Settings/Post Status also got a visual pass.

= 1.9.26 – 1.9.28 =
* Changed: "Who can view reports" is now a free role-picker for every tier. Removed the Customizer's Custom CSS field in favor of WordPress's own Additional CSS. Admin UI refinement; addressed Plugin Check findings; fixed an incomplete uninstall cleanup.

= 1.9.18 – 1.9.25 =
* Fixed: tag-matching scored zero for non-Post content types; a background job that could get stuck "Running…" with no manual restart.
* Changed: several WordPress.org compliance fixes and admin UI polish (page width, status pills, dark-mode search, reduced-motion, keyboard accessibility).

= 1.9.0 – 1.9.17 =
* Added: a chart hover tooltip, Voyage API call tracking, author exclusion, a per-signal score breakdown tooltip. Fixed the usage chart lagging a day behind. Rewrote the plugin description to lead with what Free actually does.

= 1.6.0 – 1.8.9 =
* IMPORTANT: introduced the Free/Pro/Pro+ split — AI matching and inline related-post boxes became Pro/Pro+ only. Every Pro/Pro+ feature gained a license gate, then physical code-stripping from the Free build. The Ariadne brand mark, named position presets, a duplicate-insertion guard.

= 0.1.0 – 1.5.8 =
* Early development history (multi-post-type support, Cornerstone Posts, the rename from "Echo Related Post" to "Ariadne Related Posts", dark mode, and more) — full detail lives in this plugin's version control.
