=== Schall AI SEO Suite ===
Contributors: markusschall
Tags: seo, search console, ai, multilingual, analytics
Requires at least: 6.9
Tested up to: 7.1
Requires PHP: 8.1
Stable tag: 1.24.1
License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

SEO intelligence for WordPress: collects the data, understands the website, finds opportunities and prepares decisions — with AI that has to show its evidence.

== Description ==

Schall AI SEO Suite is an SEO controller, closer to SISTRIX, XOVI or Ahrefs than to an on-page plugin — but simpler, AI-centred and calm to use. It works inside your WordPress admin and needs no frontend output.

= What it does =

* Indexes your content in every language and maps its internal links.
* Imports search data from Google Search Console (up to 16 months back) and visits from Independent Analytics, Google Analytics 4 or Matomo.
* Shows the state of your website on "Today" — with tiles you choose, periods from 7 days to 12 months and comparisons with the previous period or year.
* Finds opportunities with fixed, traceable rules and prioritises them: the few for today, and every open one as a list with filters, bulk actions and CSV export.
* Lets an AI explain what the data shows — only with evidence from your own data, never with invented causes.
* Answers questions about your website in a chat, with the figures it used.
* Tracks keywords, language markets and a timeline of what changed and what you did.
* Watches your competitors in the Google results for your tracked keywords, week by week (optional, with your own Serper.dev key).
* Writes a monthly report with an AI summary and warns you about sudden drops, by e-mail if you like.

= What it does not do =

* It does not replace Yoast SEO or Rank Math — no sitemaps, meta tags or schema output. Those plugins keep their job.
* It changes nothing on your website unless you ask for it.
* It does not claim causes: it shows what was measured.

= Requirements =

* WordPress 6.9 or later, PHP 8.1 or later, MySQL or MariaDB.
* An AI provider of your choice with your own key (Anthropic, OpenAI, DeepSeek, Ollama Cloud) or a local Ollama. AI costs are billed by your provider, not by us.
* Google Search Console access for the website.
* Optional: TranslatePress for multilingual websites; Independent Analytics, Google Analytics 4 or Matomo for visit data; a Serper.dev key for competitor tracking (billed by Serper.dev).

= Editions =

* **Light** — every installation without an active license (free download from schall-ai.de): full overview, page analysis and data collection; limited daily work (5 questions, 3 AI explanations of opportunities), 10 tracked keywords, 1 language market, 14 days of visible timeline. Recording continues — after activation the full history is there.
* **Premium** — with an active license: no Light limits (up to 200 tracked keywords in the daily sync), updates and support.

= Privacy =

The suite collects no data about visitors and sets no cookies. Page titles, summaries, metrics and search queries go to the AI provider you choose. Visit figures are fetched from Google Analytics or your Matomo server only in aggregated form per page and day; with a Serper.dev key, search terms go to Serper.dev. When an administrator opens Settings › Schall AI › Schall AI SEO Suite › Documentation, the web server downloads the user guide from www.markus-schall.de at most once a day, without the site address or any personal data, and keeps a copy in the uploads folder; uninstalling always removes it. The complete list — including license checks, link checks, report e-mails and voice input — is shown under Settings › Schall AI › AI SEO Suite › Privacy & data, and a suggestion for your privacy policy is added to the WordPress privacy policy guide. Personal data of individual users can be exported and erased with the WordPress privacy tools.

== Installation ==

1. Upload the ZIP under Plugins › Add New › Upload Plugin and activate it.
2. The setup (AI SEO Suite › Setup) guides you through the AI provider, the website profile, Google Search Console and keywords. Every step except the content index can be skipped and done later.
3. To connect Google Search Console, create your own OAuth app in the Google Cloud Console (the connection page lists every step) or use a service account.
4. To remove the Light limits, enter your license key (you find it after purchase at konto.schall-ai.de) under Settings › Schall AI › AI SEO Suite › License.

== Frequently Asked Questions ==

= Do I need Yoast SEO or Rank Math? =

Keep whichever you use. The suite reads their data but does not replace them.

= Why does the Search Console connection stop after seven days? =

Your Google Cloud app is still in the publishing status "Testing". Google ends sign-ins of such apps after seven days. Publish the app (status "In production") on the OAuth consent screen — in newer consoles under Google Auth Platform › Audience — and sign in again. With Google Workspace you can use the user type "Internal" instead.

= Which AI provider should I use? =

Any of the supported providers works. Larger models give better website profiles and answers. With the operating mode "Local only", AI requests never leave your server.

= What happens when my license expires? =

The last version you were entitled to keeps working without the Light limits; new updates and support end. No data is deleted.

= What happens on uninstall? =

By default all collected data is kept, because search data older than 16 months cannot be fetched again. Credentials (Google connection, Matomo token, AI provider keys, REST keys) are always removed. If you choose to delete all data, the license is also released at the license service.

== Changelog ==

= 1.24.1 =
* The manual is now downloaded from schall-ai.de (Settings › Schall AI › SEO Suite › Documentation).
* AI Kit 1.50.5: the cause check and the AI instructions now agree, plural forms ("declines", "lead to") are recognised, and "search results in …" no longer counts as a claimed cause.
* The tab bar under Settings › Schall AI has a fixed order for all Schall AI plugins.

= 1.24.0 =
* The edition without a license is now called "Light" everywhere (until now "Demo"): same features and limits, free to download from schall-ai.de. A license key turns the same installation into Premium.
* Product page, prices and updates moved to schall-ai.de/plugins/seo-suite/; English and all other non-German interfaces link to the English page.
* "Open customer area" now leads to konto.schall-ai.de, where buyers find their license key, the download, their sites and invoices.
* The license page header names the product instead of "Premium".
* User guide in eleven languages updated accordingly.

= 1.23.0 =
* Bundles Schall AI Kit 1.50.3 with the current cockpit (failure reasons, wait times, machine load, uptime targets). As the plugin with the newest kit on a site, the SEO Suite provides this runtime to all Schall AI plugins there.
* The cockpit names the plugin "SEO Suite", like the other Schall AI plugins.
* Failed long-running imports (for example the first Search Console import) appear in the cockpit as "error in the job" instead of "other".
* Chat: the result of an executed action is no longer listed a second time among the data sources of the answer.

= 1.22.6 =
* Independent Analytics with TranslatePress: visits were counted several times, because Independent Analytics keeps one address per post and that address follows the language of the last visitor. The numbers now belong to the whole post, so the totals on Today, in the monthly report and the share of AI visits are correct.
* Visits per language are no longer shown for this combination, because they cannot be measured. Clicks and impressions per language are unaffected, and Google Analytics 4 and Matomo keep their figures per language.
* After the update the stored visitor history is rebuilt once in the background from the data in Independent Analytics. Visit totals drop as a result, and earlier visitor observations disappear from the history.

= 1.22.5 =
* Independent Analytics: a new optional bot filter under Connections stops counting page views from Chrome on Linux, which some bots imitate. It is off by default, applies to new page views only, and also affects real visitors using Chrome on Linux.

= 1.22.4 =
* Visitor numbers from Matomo and, rarely, Google Analytics 4: when a source reports several addresses for the same page on the same day (for example with campaign parameters), they are now combined. Before, only the last one was kept, so page views could look far too low. This applies to newly fetched days. Independent Analytics was not affected.
* Recalculating the activity history after an update now starts two minutes later, so a queue run that began before the update cannot block it.

= 1.22.3 =
* Activity history: Search Console observations (rankings, impressions, click-through rate) since October 5, 2026 are recalculated from the corrected data once after the update, because some were based on wrong page values. Your actions, notes and visitor observations stay as they are.

= 1.22.2 =
* Search Console: a jump link to a heading sits in the same search result as its page, so it now counts for clicks only. In 1.22.1 its impressions were added as well, which made impressions per page and language too high and click-through rates too low. The same rule now applies to tracked keywords and to weekly search queries per page.
* After the update the Search Console history and the weekly search queries are fetched once more; language markets are recalculated afterwards.

= 1.22.1 =
* Search Console: when Google reports several addresses for the same page on the same day (for example a jump link to a heading next to the page itself), they are now added up. Before, only the last one was kept — usually the one with the fewest clicks — so page values, language markets and the average position per language could look far worse than they were. Totals for the whole website were not affected.
* After the update the Search Console history is fetched once more to repair the stored days. Connections shows the progress; language markets are recalculated afterwards.

= 1.22.0 =
* Schall AI Kit 1.39.0 bundled (before 1.29.0).

= 1.21.0 =
* The cockpit card "Needs you" can be read in the background by the shared AI Kit (from 1.37.2). Broken links and the traffic drop alert of the suite then show up in the "Schall AI" admin bar within minutes instead of after the next cockpit visit. Viewers' permissions in the cockpit are unchanged.

= 1.20.0 =
* Links › Broken Links: "Change link" next to "Remove link" gives a link a new target address after a confirmation. If the old link redirects, its target is already suggested. Only the address changes; link text and everything else stay, and WordPress keeps the previous state as a revision.
* Links in custom HTML blocks can now be removed and changed; in button and image blocks the address can be changed. Before, almost every spot reported that the link sits in a button, image or other block.

= 1.19.0 =
* "Create a banner in Banner Studio" in the page dossier: with Banner Studio 0.18.0 the new banner also gets the categories, tags and page type of the page and its strongest search queries as keywords, and Banner Studio starts three AI drafts right away. After your review you take one over, switch the banner to active and save. Older Banner Studio versions keep working as before.

= 1.18.0 =
* Page dossier: "Create a banner in Banner Studio" opens a new, unsaved banner for the page in Schall AI Banner Studio. From Banner Studio 0.17.0 the draft already carries name, texts, topic and language from the page; older versions receive the target page and a brief for the AI drafts. Shown only for published posts, for users who may open Banner Studio, and only when it is installed.
* The page dossier is tidied up: every section is the same card, with the common page head (chat and tips), the page itself as a card with its key facts, and a section bar that stays at the top while reading. The timeline is called "Events", link suggestions and the banner sit side by side at the end.

= 1.17.1 =
* Imports that stopped half way (Search Console history, weekly search queries, visitor numbers, AI visits) are resumed by the daily maintenance at the saved position, or ended cleanly after three attempts without progress. Before, they could stay "running" for good, and the daily Search Console sync stopped with them. Activity and the queue now show such a run as waiting for the maintenance or as stopped.
* Starting the content index a second time no longer resets a run that is already in progress.
* Schall AI Kit 1.29.0 bundled.

= 1.17.0 =
* Schall AI Kit 1.27.0 bundled.
* Every background job of the suite appears individually under Settings › Schall AI › Activity › Queue and in the cockpit under "Running now": with a clear title, its state and reason (for example waiting because a local image is being generated), retry for failed jobs and run now. Runs with many steps, such as the Search Console history, appear as one job with progress ("34 of 70").
* Finished jobs are counted exactly once in the cockpit history.

= 1.16.1 =
* Cockpit: "Needs you" now counts only the recommended opportunities with little effort (today's selection) and links to Opportunities › "For today". Before, it counted all open opportunities with little effort, which on a large site meant hundreds.
* Schall AI Kit 1.25.2 bundled: waiting states are marked uniformly, "Step N" is also recognised as "ETAPE" and "ADIM".

= 1.16.0 =
* Schall AI Kit 1.25.0 bundled (Cockpit 1.2, shared vocabulary in eleven languages). The suite takes it from the released tag and checks every file against a pin.
* Cockpit (Settings › Schall AI): the area card shows open opportunities and confirmed link defects. "Needs you" now lists a drop in Google Search, an incomplete setup, confirmed link defects and open opportunities with little effort, each with a link to the matching page. An expired Google sign-in appears there once, as a background process to check.
* Background jobs no longer lose AI work while the AI is only busy: if a local image is being generated, the Local Connector is checking image jobs, the daily budget is used up or the connector sleeps, keyword classification and the monthly report wait (at most one day) instead of continuing without AI; opportunity interpretations are caught up by a follow-up run. Keyword classification now runs as background work.
* Every source language works the same: causal phrases in AI answers are checked with the shared vocabulary of the AI Kit in all eleven languages, "Step N" is recognised in every language (follow-up buttons, ID guard, paragraphs), and the eight example questions are recognised in every language regardless of the admin language.
* Inside the suite the plugin is called "SEO Suite" (activity, Schall AI menu, cockpit); outside it keeps its full name.

= 1.15.0 =
* Switch Lyte embeds: posts that still store videos as WP YouTube Lyte lines ("httpv://") or [lyte] shortcodes can be rewritten into embeds that WordPress understands itself — in the block editor into an embed block, in the classic editor into the YouTube URL on its own line, keeping start time and playlist. A dry run shows every spot old → new and what stays (text in the middle of a paragraph, audio-only embeds); the switch runs in the background after your approval, saves a revision of each post first and records it in the timeline. Visitors see the same preview before and after. The tab appears under Links › Videos only when there is something to switch.
* Video checks with thousands of videos: due confirmations of gone videos now always come first, so a gone video no longer waits for days behind new ones. The settings and the status page say when the daily budget is too small for the chosen interval and how many checks per day it needs.
* Preview on the website: a YouTube start time in the URL ("&t=90s") is kept when WordPress embeds the video via oEmbed.
* Measured with 5,000 videos on a test site: recording about 20 ms per post, a check about 3 ms plus the network, a post with five previews about 4 ms, the inventory about 140 ms.

= 1.14.2 =
* Shared research layer updated to Schall Research Kit 0.10.1: a web search result no longer overwrites a page that was already fetched in the shared research store. Before, the store could return a Google snippet instead of the page content, which also confused duplicate detection in Schall AI Content Radar. Entries damaged earlier are not repaired automatically.
* WordPress dashboard widget: for a view saved for one language the short code now reads "DE" instead of "DE_DE", like everywhere else in the suite.
* Ready for the Schall AI Dashboard: once that plugin is installed, it can show the suite's open opportunities, broken link targets and gone videos.

= 1.14.1 =
* WordPress dashboard widget: the clicks now come from the view last opened on Today (period, comparison, language) instead of only the default view, and the label names the period. Before, the widget said the figures were not precomputed whenever Today had been opened with another period.
* The widget only warns about the setup when steps are still open, like the suite's own notice, and names them. A complete setup without "Done" clicked no longer counts as unfinished.

= 1.14.0 =
* Videos everywhere the suite reports: a "Videos" tile on Today (gone, restricted, unchecked for over 30 days, with replacement suggestions), opportunities "Replace video" and "Fix VideoObject", a "Maintenance" section in the monthly report and an optional instant e-mail when a video is confirmed gone or five links are newly broken (at most one per day).
* Page dossier: a "Videos" section with each video's state and a check of the page's VideoObject as Google sees it — required fields, player address, thumbnail, expiry, gone videos — plus whether the video is the main content. A long article with a supplementary video gets "Google shows no video result here, that is normal". The check runs weekly in the background or on request.
* Pages list: new column "Video hints". Status page: check method for YouTube, Data API quota today, pauses and whether the image folder is writable. The "Broken links" tile shows since when the oldest link is broken.
* WordPress dashboard widget: clicks of the last 28 days with a curve, warnings in a fixed order (license, setup, connections, gone videos, broken links, drop alarm) and the three most important opportunities — only from precomputed data, no outgoing request, no AI.
* Abilities: get-video-inventory, get-video, start-video-check and request-video-replacements (with confirmation); get-link-health now names state and reason. The chat answers "Which videos are gone?" and "What does the video in article X show?" from them. Accepting a replacement remains a human action in the admin area.

= 1.13.0 =
* Replacement search for gone videos: for a video that is gone or restricted, "Find replacement" looks for an equivalent video on YouTube, ARTE, ARD and ZDF. The AI first determines the video's role in the article (interview, speech, tutorial …) and what a replacement must keep; the web search (Serper.dev) finds candidates, the suite checks each one like an embedded video, and the AI judges whether it can take over the role.
* Each suggestion shows thumbnail, channel, date, length, language and a score out of 100 in five parts (role, meaning, language, availability, date) with the AI's reasoning — numbers the data does not support are removed. Warnings point out what to check: another channel than the original, a very different length, reaction videos and compilations, an expiry date or the broadcasters' terms. An interview, speech or news report from another occasion scores 40 at most, a video that may not be embedded 50 at most.
* Nothing changes until you accept a suggestion: the confirmation shows old → new for every spot in every post, you choose the spots and whether the credit line below the video is updated too. Only the embed is exchanged, in its form (an iframe stays an iframe, a Lyte line a Lyte line); the previous state is saved as a revision first, and the timeline records "Video replaced". Without revisions, or if the post was edited since it was indexed, the suite changes nothing.
* New sub-tab Links › Videos › Replacement suggestions; "Find replacement" also works for several videos from the list. The search only runs on request; the demo allows one search per day.
* Check log: videos from ARTE, ARD and ZDF/3sat now show their own check method instead of "no check method".

= 1.12.1 =
* Broadcaster libraries: right after the update, videos from ARTE, ARD, ZDF and 3sat that had no check before are checked immediately and get their title and thumbnail — instead of waiting for the next regular check. The same happens when you switch a broadcaster on.

= 1.12.0 =
* Broadcaster libraries (beta): videos from ARTE, the ARD Mediathek, ZDF and 3sat are now checked like YouTube and Vimeo — available, not embeddable, only at certain times (youth protection), login required, expired or removed. Each broadcaster has its own switch under Settings › Schall AI › Schall AI SEO Suite › Videos.
* "Available until": the suite reads the expiry date, shows it in the list and the detail view, reports "expires soon" in the timeline fourteen days ahead and checks such videos daily.
* Thumbnails and titles for these videos come from the broadcasters and are stored on your server; the preview on the website now also covers their players. After the click, the broadcaster's unchanged player appears, as their terms require.
* If a broadcaster answers three times in a row in an unknown format, its check pauses until the next update instead of producing wrong results.

= 1.11.1 =
* Faster page loads: the suite no longer asks the database for each of its 31 tables on every request. Visitor pages only compare the schema version (no query); the admin area, cron and WP-CLI confirm the tables at most once a day. A missing table is still detected and recreated, and the status page always checks fresh.

= 1.11.0 =
* Video preview on the website (replacement for WP YouTube Lyte's click-to-load): embedded YouTube and Vimeo videos are shown as a thumbnail from your own server with a play button. Only a click loads the player — YouTube via youtube-nocookie.com, Vimeo with "do not track". Before the click, the page makes no connection to YouTube, Google or Vimeo.
* Recognized: regular iframes, addresses alone on a line, embed blocks and Lyte's own notations (httpv:// lines and the [lyte] shortcode) — they keep working after Lyte is deactivated.
* While the suite's preview applies, it switches Lyte off for that page view only; Lyte itself, its settings and its cache stay untouched. A trial mode shows the preview to logged-in administrators only, so you can compare live before switching it on for everyone.
* Gone videos show "This video is no longer available." (or keep the preview, or hide it); videos that may not be embedded become a link to the provider. Feeds get the image with a link to the post; excerpts contain no video text.
* Accessible: a real button with the video title, keyboard operation, focus moves into the player, "Video loaded" is announced. No layout shift; the script is under 2 KB and only loads on pages with a video.
* New settings under Settings › Schall AI › Schall AI SEO Suite › Videos › Preview on the website: off / trial mode / on, note below the video (default text per provider, own text, or taken over from WP YouTube Lyte), title on the thumbnail, "Watch on YouTube" link, load the first thumbnail immediately, behavior for gone videos. Default: off.
* Demo: the first 10 videos get the preview.

= 1.10.1 =
* Broken links: the list fits its frame again. "Broken since" now appears in the status column, last and next check share one "Check" column, and the row buttons are stacked — before, the "Action" column stuck out of the frame on common screen widths.

= 1.10.0 =
* Broken Link Checker: the link check now runs automatically — healthy links every 30 days, broken and unclear ones every 3 days, new links within an hour of saving. Each address is checked once, even if it appears in many posts and language versions, with at least one second between requests per server.
* Fewer false alarms: redirects are followed (up to five hops), a failed HEAD request is retried with GET, and if an http address fails but its https version works, the link counts as working ("only reachable via https"). A 404 or 410 only counts as broken once a second check at least 24 hours later confirms it; servers that do not respond or only return errors only count after three days. Bot protection, "access denied" and similar refusals are shown as "refused", never as broken.
* Links › Broken links lists each address once with status, reason, "broken since", last and next check, filters, search, sorting, bulk actions and CSV export. "Found in" shows every post with the link — "View page" and "Open in editor" open in a new tab — and "Remove link" takes out only the link after a confirmation, with a revision to undo it. Links inside button or image blocks are left to the editor.
* Links to videos from the inventory take their status from the video check. Internal links to deleted pages are checked again; links from deleted or unpublished posts no longer count.
* New settings tab Settings › Schall AI › Schall AI SEO Suite › Link check: automatic check on/off, intervals, new links, and a "never check" list for domains or address prefixes.
* Page metrics, the "Broken links" tile on Today, opportunities and the dossier now count only confirmed broken links. Confirmed breakages and removed links appear in the timeline.
* Demo: the first 200 addresses are checked.

= 1.9.0 =
* Video check: the suite now checks in the background whether every embedded video still plays — weekly by default, spread over the days, with a daily budget. YouTube and Vimeo are asked via their documented oEmbed endpoints; for YouTube, a missing thumbnail serves as a second piece of evidence. Your own video files are looked up in the uploads folder.
* Each video gets a status with a reason: available, problematic (embedding not allowed, blocked in your countries, age-restricted, still processing), gone (deleted, private, removed, channel closed, file missing) or not yet clear (provider unreachable, refusing requests, contradictory results). A negative result only counts once a second check at least 20 hours later confirms it, or when two independent pieces of evidence agree; network errors are retried and never count as a result.
* Optional YouTube Data API key under Settings › Schall AI › Schall AI SEO Suite › Videos: it names the exact reason and checks up to 50 videos per request. The key is stored encrypted and never shown again; it can also come from wp-config.php (SCHALL_SEO_YOUTUBE_KEY).
* The video list shows status, reason and "since"; the detail view shows the latest checks, the history of changes and "Check again". After "Watch live" you can record "Plays" or "Does not play" yourself. A new "Check log" tab shows today's checks, budgets, paused providers and the latest changes of all videos, with "Check due videos now" and pause/resume.
* Gone and restricted videos appear in the timeline under "Since your last visit" and in Links › Broken links under "Broken videos". The status page, the activity overview and the privacy overview list the check.
* Demo: the check covers the first 10 videos.

= 1.8.0 =
* Video previews: once the video module is on, the suite fetches the title, channel and official thumbnail of every YouTube and Vimeo video in the background, stores the image in two sizes in the uploads folder and refreshes it weekly. The list gets a Preview column with the origin (official, still frame, no image); the detail view shows the large image with its origin and date.
* "Watch live" in the detail view loads the provider's real player only when clicked, so you can see whether a video plays today. "Refresh preview" fetches image and title again right away; for several videos it is a bulk action.
* For your own video files, "Create still frame" makes a thumbnail from the video in your browser.
* Fetching uses only the providers' documented oEmbed endpoints and thumbnail servers, with no redirects and with size limits; your visitors load nothing from YouTube. A separate switch under Settings › Schall AI › Schall AI SEO Suite › Videos turns it off; the privacy overview lists the new data flow.
* If YouTube or Vimeo returns no details for a video, the detail view says so (for example "probably deleted") without changing its status — checking availability follows in a later version.

= 1.7.2 =
* Shared AI layer updated to Schall AI Kit 1.20.0, the version the other Schall plugins use. The SEO Suite works as before and sends no images; the new image options in the shared AI provider settings belong to other Schall plugins.
* After an update that only brings a newer AI layer, the suite now completes its setup on the next admin visit. Previously the AI layer could stay "not ready" until the next database update of the suite: no usage counting, and the Ask page found no provider.

= 1.7.1 =
* Video inventory: the language column stays on one line. A video used in every language of the site shows "all 11 languages", otherwise short codes such as DE · EN; the full names appear on hover. Previously a site with eleven language versions listed eleven names in every row.
* The Videos tile names every provider, including those used only once, such as 3sat or your own video file.

= 1.7.0 =
* New video inventory under Links › Videos: once switched on (Settings › Schall AI › Schall AI SEO Suite › Videos, off by default), the suite finds every embedded video in published posts and pages — YouTube including Shorts, live streams and playlists, Vimeo, ARTE, ARD, ZDF and 3sat, your own video files, other players in an iframe and embeds made with WP YouTube Lyte — and lists each video once with all places where it appears. Filter, search, sort by column, mark videos as "leave as is", export as CSV and open a detail view with the text around each embed.
* The title of a video comes from the credit line below it ("Title | Programme | Channel") or the caption of an embed block, so it stays known even if the video disappears one day.
* Reading only: posts are not changed, and no request goes to YouTube or any other provider. Checking whether videos still play follows in a later version.
* The tab Links › Link health is now called Broken Links; it will also list broken videos once they are checked.

= 1.6.1 =
* Table of contents: pages and posts can be excluded from automatic insertion under Settings › Schall AI › Schall AI SEO Suite › Table of contents — tick pages in a list that shows how many headings each has, and add posts by address, title or ID. The front page never gets one automatically; a [toc] in the text still works everywhere.

= 1.6.0 =
* Every list can now be sorted by clicking a column title; a second click reverses the order. Lists with several pages sort across all pages, short lists sort instantly in the browser. Rows without a value stay at the bottom.
* Keywords › Tracked: mark keywords as favorites with the star in their row. A small picker shows the categories as emojis — Brand, Business, Guide, Springboard (positions 4–15), Defend (top 3) and Other — with a suggestion based on intent and position. Filter by favorites or by category, sort by favorite, and rename, add or remove categories. Favorites apply to all users of the site.
* The key figure tiles at the top of each screen are now white with a thin outline, as under Opportunities.

= 1.5.2 =
* Research layer (Research Kit 0.10.0): other Schall AI plugins can now ask for the structure of a public page — navigation, sections and optionally fonts and colours — for example Schall AI Looks for its reference profile. Nothing changes in the suite itself.

= 1.5.1 =
* Chat: an action is only offered for approval when it can be carried out. Keywords and pages named in the request are looked up by the suite (candidates included); if something cannot be found, the assistant says so instead of preparing a change.
* Chat: the assistant knows today's date (time zone of the website). A date more than a year away is only accepted when the request names the year.
* Chat: proposals and results read in words ("“kpi spedition” · new: tracked", "Added to the timeline, for 14.10.2026") instead of raw values, and a failed action explains itself in the language of the interface.
* Monthly report: the AI summary is no longer rejected for writing "the query led to 360 clicks"; the prompt names the phrases the check treats as a cause, and a second attempt is told which phrase to replace.

= 1.5.0 =
* New tab Settings › Schall AI › Schall AI SEO Suite › Documentation: the user guide as a PDF in eleven languages, with "Open in new tab" and "Download PDF". The web server loads the guide from www.markus-schall.de at most once a day and keeps a copy; if the site cannot be reached, the last copy is shown.
* The tips panel of every screen now links to the user guide.

= 1.4.0 =
* First release for sale. The same features as 1.3.5; every installation without an active license starts as the demo with full insight and limited daily work.

= 1.3.5 =
* Multisite: sites added later to a network now start with the right license state.
* License page: after a revocation it now says what actually happens — a Premium installation continues as the demo.
* Setup: the demo is named in the first and last step and in the overview, each with "Buy license" and "Enter key".
* Every demo limit now offers "Enter key" next to "Buy license".

= 1.3.4 =
* Competitors: each week now uses only search results from that week. Answers from the shared research cache are reused for at most three days and never across a Monday, so week-over-week changes compare two real snapshots.

= 1.3.3 =
* Keywords: the tab bar stays at the top on every tab.
* All search queries: a language selector right in the toolbar of the list.

= 1.3.2 =
* Opportunities now opens with “All open”; “For today” is the second tab.

= 1.3.1 =
* Opportunities: the overview tiles and charts now sit on white cards so they stand out from the admin background.
* The “All open” tab now comes first, before “For today”.

= 1.3.0 =
* Opportunities: tick several opportunities and defer, mark as done or reopen them together — or apply the action to all matches of the current filters.
* Export the list as CSV with the same filters (semicolon-separated, opens directly in Excel, Numbers and LibreOffice).

= 1.2.0 =
* Opportunities › All open: an overview above the list — open opportunities, quick wins, pages affected and AI explanations, a chart of impact and effort, and bars by topic and language plus the pages with the most opportunities.
* Every part of the overview is a filter: a circle, a bar or a language leads to exactly those opportunities in the list. New filter: rating range.

= 1.1.0 =
* Opportunities: three tabs — “For today” (the five picked for today, as before), “All open” and “Done and deferred”.
* “All open” lists every open opportunity with search, topic, effort, “only new” and three sort orders, 25 per page; each row leads to the full card, and “Done” or “Defer” returns to the same place in the list. Deferred and done opportunities can be reopened.
* The “Open opportunities” tile and the topic chips on Today now lead to this list.
* Each rule now keeps up to 1,000 findings instead of 25, so the number of open opportunities can rise noticeably.

= 1.0.4 =
* Competitors: the daily run now queries up to ten keywords a day as planned; before, each run stopped after its first short batch (about three to five keywords).
* The weekly query panel shows when the next daily run is due.

= 1.0.3 =
* Today: flat line charts (visits over time, brand vs. non-brand) take a full row, so they no longer sit next to a long list with empty space below; position groups and AI assistants are drawn taller.
* Actions in "All languages" show the number of language versions instead of the title of a random version.

= 1.0.2 =
* Today: up to 12 charts and lists can be shown at once (previously 8), so the new tiles fit next to your current selection.

= 1.0.1 =
* AI explanations of opportunities no longer show internal evidence markers such as "(b3)" or "b1" in their text — on Today, under Opportunities, in the page dossier, in reports and in chat answers.
* Today shows the first sentence of an explanation again instead of the whole text.

= 1.0.0 =
* Today: six more tiles to choose under "Customize": actions with clicks and impressions 28 days before and after, the latest Google updates with the whole website before and after, your most important tracked keywords, competitors, the latest monthly report, and keywords in the Google top 10.
* New metric tile "Conversions" wherever the visitor counter reports them.
* Version 1.0: the customizable "Today" overview is complete.
* Fixed: a site-wide action (for example a note without a page) made the change markers disappear from the charts in "All languages".

= 0.109.0 =
* Today: two more periods at the top — 7 days and 12 months.
* Under "Customize" you choose whether the period at the top applies to all tiles or each tile gets its own, and whether figures are compared with the previous period or the previous year.
* Clicking a metric tile (clicks, impressions, click-through rate, position, visits) shows only its line in the chart, with the comparison dashed. A second click shows clicks and impressions again.

= 0.108.0 =
* Today: seven new charts and lists to choose under "Customize": position groups per week (shown by default), search queries with a switch between top, winners, losers, new and lost, visits over time with the previous period dashed, brand vs. non-brand, AI visits per assistant, pages in decay as a list and AI landing pages.
* "Biggest movements" becomes "Pages" with the tabs top (most clicks), rising and falling. The trend chart now shows Google updates as shaded bands.
* A half-width tile without a neighbour takes the full row, so the overview has no gaps.

= 0.107.0 =
* Today: choose which tiles the overview shows. "Customize" at the top right opens a panel where you switch each tile on or off and arrange tiles with arrows; the selection is saved for your user only, and "Restore default" brings back the default.
* Seven new metric tiles to choose from: search queries on page 1 (with top 3), pages in decay, open opportunities, page views, brand share, cannibalization and broken links. The default overview adds the first two; at most 12 metrics and 8 charts and lists are visible at once.
* Only visible tiles are calculated, and their data is prepared in the background after each import, so the overview does not get slower.

= 0.106.0 =
* Keywords › Competitors: domains that belong to you, such as a second website, can now be excluded. Choose "Exclude" in their row or list them under "Excluded domains", one per line. They no longer count as competitors, also in past weeks; your own position stays as Google showed it.
* Monthly report: the AI summary now writes figures in the number format of your language ("1,857 clicks", "1.16 %") instead of raw values such as "1857" or "1.16 percent".

= 0.105.2 =
* Monthly report: the AI summary now receives the report figures as evidence. Before, every summary was discarded as not supported by the evidence. For a report without summary, choose "Write summary" once.

= 0.105.1 =
* Chat in Czech, Russian, Polish, French and other languages with a space as thousands separator: answers no longer get the note "these figures appear in no analysis" for figures that are in the analyses. Click-through rate and average position in the findings now include the previous value.

= 0.105.0 =
* Chat: the analyses behind an answer now appear as one calm list ("Analyzed from your data") with a readable line each — page, period and scope in words instead of technical parameters in a code box. Long values in the expanded table no longer squeeze the labels.

= 0.104.2 =
* Chat: when you ask how a page developed, the assistant can now fetch its metric history by title or address. Before, a yellow note "content 0 does not exist" could appear instead.
* Chat and explanations in French and the other translated languages: the check against claimed causes no longer applies German and English word lists to them. A French answer saying that the data does not reveal the cause ("la cause") was discarded before.

= 0.104.1 =
* Chat in French: answers about how a page developed were often discarded as a claimed cause because "résultats de recherche" (search results) was mistaken for "résulte de" (results from). Fixed.
* User guide: new screenshots in all eleven languages, including the Tips sidebar in the tips chapter.

= 0.104.0 =
* Every screen now has a Tips button (the info sign at the top right). It opens a sidebar with tips and notes on all functions of that screen or tab, as expandable questions, followed by the tips that apply everywhere. Where there is something to see, "Show" scrolls to it and highlights it briefly.
* The user guide has a new chapter "Tips and tricks for the AI SEO Suite" with the same tips, in all eleven languages.

= 0.103.0 =
* Table of contents: write [toc] in a post (or [schall_toc] if another plugin already uses [toc]) and the suite inserts a table of contents built from the headings of your own text — headings that other plugins add when the page is output, such as the post titles of Display Post Types, stay out. Each heading gets a jump anchor; an existing anchor is kept.
* Settings › Schall AI › Schall AI SEO Suite › Table of contents: insert automatically before or after the More tag or before the first heading (off by default), for chosen content types and from a minimum number of headings; heading levels (H2–H3 by default), title, and display — initially closed with the first entries and "… show all" (3 by default), collapsible, or always open. No JavaScript; the stylesheet loads only on pages with a table of contents. Exclude a heading with the CSS class no-toc.

= 0.102.0 =
* Keywords › Search queries: a new list of all search queries of the last four weeks — searchable, with or without your brand, sortable by clicks, impressions, click-through rate, position or change, 50 per page, each with the change against the four weeks before.
* Keywords › Cannibalization and › Different intent: search and pagination; nothing is cut off silently any more.
* Keywords › Tracked: add keywords by hand — several at once, separated by commas, in the language of the view or the one you choose. A keyword the suite already knows as a candidate is taken over; the demo limit applies as before.
* Pages › AI visitors: on first opening, the tab starts reading the referrers right away instead of waiting for the daily run — and no longer claims that the visitor counting has no visits from AI assistants before it has looked.

= 0.101.0 =
* Pages: a new "AI visitors" tab shows visits from ChatGPT, Perplexity, Gemini, Copilot, Claude and other AI assistants — the last 28 days against the 28 before, their share of all visits, a weekly chart per assistant over 26 weeks, a table per assistant and the landing pages where these visits began, each with a link to its page dossier.
* "Today" has a new "AI visits" tile with the last 28 days and a 16-week trend.
* The referrers come from the connected visitor counting: Independent Analytics, Google Analytics 4 or Matomo. The suite recognises the assistants itself — Independent Analytics, for example, lists Perplexity as an ordinary referrer. Up to 16 months of history are read once in the background, then each day together with the visitor sync.

= 0.100.0 =
* Keywords: a new "Competitors" tab shows who ranks ahead of you for your tracked keywords — per domain the keywords where it ranks ahead of you, its share of the top 10, its average position and the change against the previous week; per keyword your position and the domains ahead of you.
* The data comes from a weekly snapshot of the first ten Google results via Serper.dev (shared research layer), for the 50 most important tracked keywords, in the language and country of each keyword.
* Off until you switch it on. At most 10 queries a day, and none once fewer than 30 would remain in the shared daily quota for other Schall plugins. The tab shows the queries of the week, today's quota and the cost (about 0.1 US cents per query).

= 0.99.0 =
* New "Reports" page: a monthly report with clicks, impressions, click-through rate, position, visits and visibility against the previous month and the same month last year, 13 months as a chart, winners and losers among pages and search queries, opportunities done, content changes, Google updates and the situation at creation — with an AI summary based only on these figures. It is created automatically once a month is fully measured and kept as it was.
* "Save as PDF" opens the browser's print dialog with a print layout of the report.
* By e-mail, off until you switch it on: the monthly report and a drop alarm (a week with clicks −30 % or impressions −40 % against the weekly average of the four weeks before). A drop always appears on "Today", even without e-mail.
* Privacy: report recipients are included in WordPress's personal data export and erasure, and the suggested privacy policy text mentions the e-mails while they are switched on.

= 0.98.0 =
* Pages: a new "Decay" tab lists the pages that get at most half of the clicks of their peak month in the last 16 months — peak month against the last 28 days, both per 30 days, with the whole website as a yardstick. Each page says whether it is found less often (impressions fell too) or clicked less often (impressions held).
* Keywords: a new "Cannibalization" tab shows search queries that two of your pages in the same language share, the page pairs behind them, a health score (the share of search queries carried by a single page) and its course over time. Your brand and search operators such as "site:" are left out.
* Opportunities: two new rules — "Far below its peak month" (with a click gain up to the peak month) and "Two pages share search queries". The recommendation for competing pages now reads "Decide which page should carry the topic."

= 0.97.0 =
* Keywords › Search queries: the site's own click-through rate per position, learned from the last twelve weeks of search queries without the brand and smoothed so it never rises with the position. Until the snapshot holds enough (3,000 impressions and 30 clicks), industry values apply and are labelled as such.
* Visibility: the clicks each week's impressions would bring at their positions with that curve — a value that falls with positions or demand, shown as a weekly chart next to the actual clicks and as a tile on "Today".
* Opportunities: a new rule "Click-through rate below expectation" for pages that get at most 60 % of the clicks their search queries usually bring. Opportunities that allow an honest estimate now carry a possible click gain ("up to +X clicks per month") and say what it is based on.
* Opportunities: "Visible but rarely clicked" now compares with the site's own click-through rate, and its potential in the score is the reach affected (impressions), as with every other rule.

= 0.96.0 =
* Weekly snapshot of all search queries per page from Search Console, filled 16 months back in the background after the update (two requests per week). Queries seen only once without a click are not stored; on a multilingual site with 11 languages the 16 months took about 20 MB.
* Keywords: a new "Search queries" tab with position groups per week (by average position according to Search Console, counted from three impressions), brand vs. non-brand clicks, winners and losers, and new and lost search queries — the last four weeks compared with the four before. It states how much of the clicks Search Console attributes to named queries.
* Page dossier: the search queries a page is actually found for, with the position trend of the last 16 weeks and a "new" marker.

= 0.95.1 =
* Page dossier: the comparison with the previous year only appears once there are at least 20 clicks to compare. A page with one click in 16 months no longer shows "−100 %".
* Charts of whole numbers such as clicks no longer label their axis with fractions.

= 0.95.0 =
* Page dossier: a 16-month chart of clicks, impressions and the previous year's clicks per week, a second chart for the average position (position 1 at the top), changes to the page as markers and Google's confirmed ranking updates as shaded bands. The card says how clicks compare with the previous year once that year is measured.
* Pages: every row shows 16 weeks of impressions as a small chart and the last four weeks against the four before. Pages that have lost clicks or impressions three months in a row carry a "losing for 3 months" badge; a tile counts them and a filter shows only those.
* History: a click chart above the list with the same changes and Google updates. Every change that altered the site shows clicks and impressions of the affected page for the 28 days before and after, side by side, without claiming a cause.
* Language markets: the share of each market in all clicks per month over 16 months, and a small chart and the share of clicks in every table row.

= 0.94.0 =
* One layout for every screen: title, a calculated sentence on the current state, and period and language selection on the right. The language bar became a compact menu, which matters with many languages.
* Links: tabs and key figures as tiles instead of WordPress tables. Language markets and History: the period selection moved into the header. Connections and Status: each area is a card with its state.
* Questions is now a tab of the Chat instead of its own menu item. The prepared questions still work without an AI provider.

= 0.93.7 =
* License tab: links to the Schall customer area, where the license key, the download, the site seats and the invoices are. After a purchase the key is there, not in the e-mail.
* User guide (11 languages): installation starts in the customer area; moving a license mentions freeing a seat there.

= 0.93.6 =
* Visual polish across all screens: one page title style and one content width, the "Discuss in chat" button no longer sits directly on the box below it, and sub-headings inside cards line up with their tables.
* Page dossier: the three measurement tables share their columns, and the link and word counts carry their own heading.
* Status page: the title matches the menu, and the operating mode is shown in words instead of "balanced".
* Smaller fixes: separator line above card actions on Today and Opportunities, notices no longer squeezed into the Keywords header, the same period selector on History as on Language markets, and wide tables scroll within themselves on phones.

= 0.93.5 =
* Shared Research Kit 0.9.1: when a page shows a consent screen instead of its content (for example "Before you continue to YouTube"), it is no longer stored as a source. For YouTube videos, title and channel are read through YouTube's oEmbed interface instead.

= 0.93.4 =
* Today opens fast in the morning, too: the overview and the watch suggestions stay ready until new data arrives instead of expiring after six hours. Open opportunities and the change markers in the chart are still read fresh on every visit.
* Pages: the totals per page are kept until the next data import, so the list no longer recalculates all measurements on every visit.

= 0.93.3 =
* No more "Translation loading for the schall-seo-suite domain was triggered too early" notice in the debug log after activating the plugin: recurring background jobs are now scheduled once WordPress has finished loading.

= 0.93.2 =
* Today: while the watch suggestions are being calculated in the background, a short note says so instead of showing nothing, with a link to see them right away under Pages › Watch. If the calculation does not run within a quarter of an hour, the note says so and points to Status.

= 0.93.1 =
* Shared Research Kit 0.9.0: pages fetched for research now carry their publication and last-modified date as the page states it. The shared research store gets two columns; existing entries stay and get their date when they are fetched again.

= 0.93.0 =
* Today: when Content Radar is active, up to three pages worth watching appear below the cards — each with its importance, its first reason and a button to hand it over. Pages can be removed from Today with "Don't show here again"; the full list stays under Pages › Watch.
* Today never waits for the suggestions to be calculated: if they are not ready yet, the calculation starts in the background and they appear on the next visit.

= 0.92.2 =
* Page dossier: when a page is a watch suggestion for Content Radar, the recommendation section shows its importance, reasons and search queries with a button to hand it over — and afterwards when it was handed over.

= 0.92.1 =
* Shared AI Kit 1.17.1: a task can be set back to a cloud model in "AI providers" even when the cloud model list is not cached; after a cloud fallback the answer names the model that actually answered; model benchmarks accept legitimately empty fields and rank by real response time at equal quality.

= 0.92.0 =
* Pages › Watch: when Content Radar is active, the suite suggests your own pages that are worth watching for new developments — up to ten, each with an importance from 0 to 100 and the measured reasons (share of impressions and clicks, movement against the previous period, searches with a year or "current", age of the content, open content opportunities).
* Each suggestion can be handed over to Content Radar with one click. Content Radar creates a draft observation with the page's search queries; nothing is searched until you approve it there, and your content is never changed.
* Chat: "Which pages should I watch?" is answered from the same suggestions.

= 0.91.0 =
* "Ask your website" and the page dossier: answers now get ready-made findings as evidence — changes against the previous period, patterns, click-through rate against a benchmark and shares — so the AI no longer has to calculate.
* "Pages with a decline" now lists the pages with the largest loss first instead of the largest percentage.

= 0.90.2 =
* Chat: an analysis no longer fails when the AI asks for a longer period than it supports; the value is set to the limit.
* Chat: the trend table shows the latest 13 weeks or months, months are named as months, and small wobbles are no longer called a direction.

= 0.90.1 =
* Chat: "since when" now names the turning point (for example "falling since the peak in the week of …") and up to three level shifts in order; partial weeks at the edge of the range no longer count.

= 0.90.0 =
* Chat: metric history reaches the AI as findings — weekly values, since when a level changed, the direction of the last weeks and unusual days — plus a weekly table.
* Chat: opportunities reach the AI as one finding each, with page, score, action and evidence; every page finding names the open opportunities of that page.
* Chat: the overview explains that Search Console and the visitor counter have their own periods and count different things, and briefly defines the metrics used.

= 0.89.1 =
* Chat: "which pages are losing" now sorts pages by the largest decline in impressions instead of listing the smallest pages.
* Chat: an analysis is no longer run with a page ID the AI guessed; only IDs named in the question or given by the page being viewed count.
* Chat: when an answer lists three or more markets, pages or queries in a paragraph without the finished table, the plugin adds the table there.

= 0.89.0 =
* Chat: pages, a single page report and tracked search queries now reach the AI as ready-made findings — changes against the previous period, patterns, click-through rate against a benchmark, shares and contributions to a decline — plus finished page and query tables.
* Chat: every language market in the overview names its pattern; a position gain is no longer described as a held position.
* Chat: when an answer names values for more than two markets, pages or queries, it places the finished table instead of listing numbers in the text.

= 0.88.1 =
* Chat: market and page tables no longer go missing when the AI places them directly next to a short sentence; a placeholder written with umlauts or capitals is recognised too.

= 0.88.0 =
* Chat: the site overview now reaches the AI as ready-made findings — comparisons with the previous period, shares, contributions to a decline, patterns and per-market clicks, position and visits — so smaller models no longer have to calculate.
* Chat: metric, market and page tables are inserted by the plugin; the AI only places them.
* Chat: numbers in an answer that appear in no analysis trigger a second attempt; if they remain, a note says so.

= 0.87.2 =
* Chat: an analysis the data selection proposes without a required input, such as link suggestions without a page, is no longer run. If an analysis fails anyway, the conversation shows one readable sentence instead of internal names and technical reasons.
* Multisite: a site that inherits the network AI settings and kept its earlier choice for preparing deeper dives now sees that choice and can return to the network settings.

= 0.87.1 =
* When a busy Local Connector hands an interactive request to an allowed cloud model, answers now name the cloud provider and model that actually answered, not the local one.
* Privacy: the legacy "Local only" mode is no longer reported when a task, such as preparing deeper dives, is explicitly assigned to a cloud provider or a cloud model is fixed.

= 0.87.0 =
* AI Kit 1.17.0: preparation task, internal model benchmark, configurable cloud fallback and loaded local models.
* Existing local preparation preference migrates once into the task assignment.

= 0.86.0 =
* Chat: under the latest answer, each suggested step gets a "Go deeper into step N" button. One click sends the follow-up question right away.
* Behind the scenes a fast model first turns the short follow-up into a precise brief, so data selection and the answer focus on exactly that step. The answer comes as a guide: what it is about, how to proceed, what to watch out for, how to tell that it worked.
* The brief uses a fast model of a cloud AI the website already uses. A local model is used only if "Locally instead" is switched on under "Only in the AI SEO Suite". Without either, the brief is skipped.

= 0.85.3 =
* Ask: "Which searches am I found for?" now lists search queries by clicks over the last 28 days, with a clicks column. Rare queries that rank first but are hardly searched no longer top the list.

= 0.85.2 =
* Ask: "Which searches am I found for?" no longer lists ignored or machine-generated search queries such as scraper queries with site operators.
* Chat notes name a capability by its label instead of its internal name.

= 0.85.1 =
* Section headings in assessments show only the section name. Some models copied part of the instruction into the heading.

= 0.85.0 =
* New answer form for requests to evaluate numbers ("analyse", "explain the figures"): a table of the key figures with the previous period, an explanation of every figure, then what it means and what you can do now. "In detail" makes an answer longer, no longer a concept.
* Assessments and evaluations use the same four sections: what the figures show, what that means, what you can do now, what is still missing.
* A short factual answer now says in one sentence what a number means, for example compared with the previous period.
* Asked from a page report or an opportunity, the assistant starts with that page instead of the whole website.
* Concepts and evaluations get as much data as assessments; short one-sentence lines are joined into paragraphs.

= 0.84.1 =
* The assistant now answers line by line: each heading, paragraph, list item and table row is its own element. Models that cannot write line breaks into their answer, as seen with local models, still produce structured answers with working tables.
* A repetition inside a single line, such as an endless chain of the same words, is cut as well. The note about a shortened answer only appears when something was actually shortened.

= 0.84.0 =
* Chat answers are easier to read: tables, headings and lists are shown, and long answers that arrive without any line break are split into paragraphs at sentence ends.
* An answer that keeps repeating the same sentences is tidied before it is saved; a short note in the conversation says so. An answer cut off at its length limit ends at its last complete sentence.
* The assistant is asked to use paragraphs, headings and tables, to write numbers and dates in the reader's notation and to leave internal references out of the text.
* Ask: the summary may be longer, no longer stops in the middle of a word and shows the same formatting as the chat.

= 0.83.3 =
* Bundles AI Kit 1.16.0. The Activity view under Settings › Schall AI › Activity › Capacity lists only circuit breakers that currently protect a route; those of routes nobody uses any more, for example after a one-off model check or a new key, are removed once a day.
* The AI provider mask now says when a stored key can no longer be read, for example after new WordPress security keys, instead of showing it as missing.

= 0.83.2 =
* Fixes metrics landing on a deleted page version: when a language version disappeared (a language switched off, or the default language changed), Search Console and visitor numbers for its addresses could stay assigned to the removed version. Such assignments are now dropped when the version is removed and resolved again when they are read.

= 0.83.1 =
* Uninstalling now also removes the Matomo token and the cached Google Analytics access token, as promised under Privacy & data. Address and website ID of Matomo stay, like the Search Console property.
* The user guide in all eleven languages describes visitor sources: Independent Analytics, Google Analytics 4 and Matomo, checking, switching and deleting a source's data.

= 0.83.0 =
* Matomo can now be the visitor source: Matomo Cloud or your own Matomo server with address, website ID and a read-only token, or Matomo for WordPress in the same installation without any credentials.
* The token is stored encrypted, never shown again and only sent in the body of requests to the Matomo server entered. A Matomo server in your own network or on its own port is allowed for exactly that server.
* "Save and check" tests the connection, website, token permissions and goals, and shows the last 28 days next to the current source before you switch. Visits are entries per page; goal completions are Matomo goals per entry page, all or a selection.
* Data of a visitor source that is not active can be deleted under Connections › Visitor numbers. The source itself is not touched.
* The privacy information gets its own "Matomo" section: with your own server it names the server, with Matomo for WordPress no data leaves the server.
* The abilities get-site-overview and get-system-status name the active visitor source (provider: iawp, ga4 or matomo).

= 0.82.0 =
* Google Analytics 4 can now be the visitor source. It uses the same Google access as Search Console: a service account with the "Viewer" role in the GA4 property, or sign-in with Google with a one-time consent to Google Analytics.
* Connections › Visitor numbers guides the setup step by step: access, Google Analytics Data API, property and key events. "Save and check" tests the connection and shows the last 28 days next to the current source before you switch.
* Switching the visitor source imports the history in the background, recalculates opportunities, language markets and the timeline, records the switch in the timeline and can be undone. Data of the previous source stays stored.
* Visits are sessions per landing page; goal completions are GA4 key events per landing page. Only page views of this website's host names are read.
* A used-up Google Analytics quota shows as waiting and retries later; missing access, a disabled API or a missing consent are named with the way to fix them.
* The privacy information gets its own "Google Analytics" section when GA4 is the visitor source.

= 0.81.0 =
* Connections: the "Independent Analytics" section is now "Visitor numbers". It shows which source counts visits and lists Google Analytics 4 and Matomo, which follow in one of the next updates.
* Visits are read from exactly one active source. Data another source has delivered stays stored but is no longer added to the counts, so a later switch of sources cannot double the visits.
* The daily visitor import now reports new data, so "Today", language markets and the timeline follow right away, and it fills missing days of the last 28 days.
* The privacy information names the active visitor source instead of always Independent Analytics, and says so when no visitor source is connected.
* The Activity view names the visitor source and shows the progress of a history import in days.
* Fixes the message shown when no visitor counting is connected; it carried an unrelated translation in all languages.

= 0.80.5 =
* Settings › Schall AI › AI SEO Suite now has a "Connections" tab right after "AI provider" that leads to the Connections page with Search Console and visitor counting.

= 0.80.4 =
* "Today" now refreshes after the daily Search Console import: the import reports new data, so the dashboard cache, opportunities, timeline and language markets follow.
* The daily import fills missing days of the last 28 days, so gaps such as the one after 22 September close automatically.

= 0.80.3 =
* Activity view: an activated license whose check is not scheduled no longer shows as ready, and an expired offline proof shows as waiting with a neutral sentence instead of blocked (license client 1.2.1).

= 0.80.2 =
* Search Console: fixes the root cause of the stopped daily import. The running import now really schedules the next one; before, the queue treated the running job as a duplicate and no follow-up was created.

= 0.80.1 =
* Search Console: the daily import can no longer silently stop. If its job chain breaks, the suite schedules it again (at most hourly in the admin area and daily during maintenance), and a run without ready access schedules the next one anyway.
* The Activity view reports a missing daily import as an error and points out data older than three days.

= 0.80.0 =
* Background work now appears in the shared Activity view (Settings › Schall AI › Activity) and in the admin bar: queue, content index, link capture, Search Console, visitor counting, keywords, opportunity evaluation, timeline, language markets, link check, daily maintenance and license check.
* Every state other than "Running" explains why, for example waiting for free AI capacity, a stalled minute schedule, an overdue daily run or a used-up AI budget. Unconnected sources show as "Off", not as "Blocked".
* The link check and the Search Console history import can be paused for one hour, eight hours or until resumed, and resumed from the Activity view.
* Snapshots contain only states, codes, counts and times; no content, search queries or error texts.

= 0.79.1 =
* The “Only in AI SEO Suite” card below the AI provider panel now has proper spacing and shows network choice, daily budget and Save in one list, like the other Schall plugins.

= 0.79.0 =
* Settings › Schall AI › AI SEO Suite › AI provider now shows the shared AI Kit panel, the same as in Translation, Internal Links and Content Radar: provider, model (fixed or “Automatic” with a quality level), per-task choices, keys and the connection check in one place. Changes apply immediately and can be undone for ten minutes.
* “Automatic” now only picks among the models of the chosen provider; another provider is only used through an explicit per-task choice. Translation models are never picked automatically.
* The daily budget stays in the “Only in AI SEO Suite” card below the panel. When the network enforces the AI settings, the panel is replaced by a notice.
* The “Local only” mode is no longer offered; keep work local by choosing Local AI or Ollama on your server as the provider.
* Bundles AI Kit 1.15.0 including its shared assets.

= 0.78.3 =
* Local AI: disconnected computers can now be removed permanently from the connector list (with confirmation). Active connectors must be disconnected first; a removed computer can be paired again at any time. Disconnected entries no longer show stale Ollama status or models.
* Bundles AI Kit 1.8.2, including the 1.8.1 fix that lets an explicit provider test reopen a blocked circuit once.

= 0.78.2 =
* Adds the shared Block 11 settings shell and bundles AI Kit 1.8.0. Provider, model, route, key, and budget values remain owned by the SEO Suite and are not migrated or reset.

= 0.78.1 =
* Updates the shared AI runtime to AI Kit 1.7.0. Temporary provider circuits and per-run request limits now pause queued work without consuming an attempt; configuration problems remain visible for review.

= 0.78.0 =
* Opportunities that concern the content itself can be handed over to Schall AI Content Radar as a search request (contract external-search-request/1). Content Radar is optional; without it nothing changes.
* The hand-over is idempotent: a repeated attempt sends the same request under the same ID.
* Status page and system status show the connection to Content Radar.

= 0.77.3 =
* The product is now called Schall AI SEO Suite.
* User guide: download of the Schall AI Local Connector with QR code; improved page breaks.

= 0.77.2 =
* User guide with screenshots in all 11 languages.
* Chat: italic text is shown as italics instead of asterisks.
* Chat: pages can be referred to by their title; the assistant finds the page report.

= 0.77.1 =
* The chat assistant now receives list fields of the website profile (target groups, markets, offering, goals) as text; before, it saw the word "Array".

= 0.77.0 =
* User guide in 11 languages (PDF).
* The demo table now shows the actual keyword limit with a license (200 tracked keywords in the daily sync).

= 0.76.0 =
* Buy a license directly where the demo draws a limit (license tab, chat, questions, opportunities, keywords, language markets, timeline, plugin list).
* An expired Google sign-in is detected and explained, with a button to sign in again; setup guide for the Google Cloud app.
* Plugin details and changelog in the WordPress update dialog.
* Deleting all data on uninstall releases the license seat at the license service.

= 0.75.0 =
* Licensed under GPL-2.0-or-later.
* Requires WordPress 6.9 and PHP 8.1.
* WordPress privacy tools: export and erase personal data; privacy policy suggestion.
* Credentials are always removed on uninstall.

= 0.72.0 – 0.74.0 =
* Local AI through the Schall AI Local Connector, end-to-end encrypted, via SchallConnect Cloud or your own domain.

= 0.54.0 – 0.71.0 =
* Demo edition, research layer, shared AI runtime for all Schall plugins, provider limits respected.

= 0.33.0 – 0.53.0 =
* Chat assistant with evidence, context, abilities and approved actions.

= 0.1.0 – 0.32.0 =
* Content index, link graph, Search Console, keyword intelligence, opportunity engine, page dossier, dashboard, timeline, language markets, REST API, multisite, WordPress abilities.

== Upgrade Notice ==

= 1.6.0 =
Sortable column titles in every list, and favorites with categories for tracked keywords.

= 1.5.1 =
Chat actions are only offered when they can be carried out; the monthly report summary is written again.

= 1.5.0 =
The user guide is now available under Settings › Schall AI › Schall AI SEO Suite › Documentation.

= 1.4.0 =
First release for sale. Existing installations keep their edition and all data.

= 1.0.0 =
Version 1.0 with six new tiles for the "Today" overview. Your current selection stays as it is.

= 0.78.1 =
Reliability update for shared AI providers. Queued work waits safely when a provider circuit or the request budget for the current run is exhausted.

= 0.78.0 =
Optional hand-over of opportunities to Schall AI Content Radar. No action needed; nothing changes without Content Radar.

= 0.77.3 =
New product name: Schall AI SEO Suite. Settings, data and license stay as they are.

= 0.77.2 =
Chat answers show italics and find pages by title; the user guide now has screenshots.

= 0.77.0 =
Adds the user guide in 11 languages.

= 0.76.0 =
Adds the way to a license in the demo and detects expired Google sign-ins.

= 0.75.0 =
Requires WordPress 6.9 and PHP 8.1. Credentials are now always removed on uninstall.
