=== DigitalM Inside SEO - full changelog ===

= 0.294.241 =
* Changed: shorter Bulgarian description of the plugin in the plugin list.

= 0.294.240 =
* Changed: the source strings in the code are now in English. Bulgarian comes from a bundled translation file (bg_BG .po/.mo/.l10n.php).
* Added: a translation template (languages/digitalm-insideseo.pot) for translators.
* Changed: the script labels are passed through the same translation, so they follow the plugin language.

= 0.294.239 =
* Plugin Check: the structure list no longer turns off query filters (all languages come from WPML "all" and Polylang empty language instead); the emoji check no longer names a remote image server; removed old inline rule exceptions on three report queries.
= 0.294.238 =
* Improved: sitemap list recognises the extra sitemaps of SEO plugins - video, local (business address / KML), news and image sitemaps. They get their own name instead of "Other" and are not ticked by default after a scan, because they repeat pages from the other sitemaps or are not pages.
= 0.294.237 =
* Fixed: sitemap scan on sites behind Cloudflare or a server that cannot reach itself by its public address. When the site cannot read its own sitemap, a second try goes straight to this server (same address, Host header). The error now says why (HTTP code, timeout, bot check, HTML instead of XML).
= 0.294.236 =
* Readme: new English screenshots and captions (14 screens).
= 0.294.235 =
* Added: requests to the hub carry the plugin language (X-SEOH-Lang). With English the hub answers in English - AI errors, limits, agency connection messages and text-check explanations. The paid plugin on the same site is covered too.
= 0.294.234 =
* Added: Search Console index checks for a language version on another domain (e.g. .eu) use that version's own locked property, and its sitemap addresses join the check queue. * Added: "done" counts per language for the monthly audit (paid plugin). * Translations: remaining visible Bulgarian texts now go through translation (page type and checkout field labels, short finding details, units); English added.
= 0.294.233 =
* Changed: "Pages with this issue" under a finding is a collapsed list - it opens on click instead of filling the screen with hundreds of addresses.
= 0.294.232 =
* Faster: the Errors screen is much lighter. Findings shared by the whole site (touch icon, many CSS/JS files, fonts and the like) were sent with one full row per page - thousands of rows; now each page is a short entry and the screen expands them back, so the list of pages is still shown. Cyrillic text is sent as is instead of escaped (about a third of the size).
= 0.294.231 =
* Fixed: "Missing translation" is cleared before each database analysis - every run added the same pages again (60 pages showed as 180). * Changed: clearer wording on the crawl screen - "found N issues", "Indexing" instead of "Indexability (the gate)", "Not enough text", language version picker, speed "test" instead of "measurement"; the label above the deep review groups is removed.
= 0.294.230 =
* Fixed: the database analysis run from the browser no longer loses findings on large sites. Orphan images, image names, hidden Cyrillic, dead products and the additional checks are now saved in separate short requests after the main save, so the host no longer stops the save half-way (auto meta descriptions, series and numbered addresses disappeared).
= 0.294.229 =
* Fixed: with WPML the site languages are read before the database analysis switches to all languages - "Missing translation" is found again and findings of translated pages keep their language.
= 0.294.228 =
* Faster: every image lookup (done counts, rechecks, content images) uses the in-memory list of file names instead of a database search per image.
= 0.294.227 =
* Faster: images are matched to the media library from one in-memory list of file names instead of up to nine table scans per image (the Errors screen spent 52 of 59 seconds on "Images without alt" on a large WPML store). * Fixed: a page marked deleted only because one structure pass missed it is removed from the list when it comes back. With WPML the plugin language in background work follows the site's default language.
= 0.294.226 =
* Fixed: with WPML the structure list is built in all languages, so a pass in one language no longer marks the other language's pages as deleted. A deleted address on a language domain is checked on that domain. Once after the update, "deleted" entries whose pages are still published are removed.
= 0.294.225 =
* Faster: the Errors screen takes the post number from the saved finding instead of looking up every address (very slow with WPML), and looks up each address only once. Add ?seoh_prof=1 to the address to see the build time per finding type in the page source.
= 0.294.224 =
* Fixed: with WPML the database analysis looks at all languages, not only the one picked at the top of the admin - the other language's findings no longer disappear after "Database audit".
= 0.294.223 =
* Fixed: images and files belong to the main language in the findings (WPML gave them the language of the admin screen at upload). The Search Console group in another language view shows only that version's addresses.
= 0.294.222 =
* Fixed: with WPML the structure menu no longer follows the language picked at the top of the admin - the menu and its items are read in the default language and without WPML swapping the menu numbers to the screen language.
= 0.294.221 =
* Fixed: with WPML the automatically found main menu is now really the one in the default language - the choice is made with WPML switched to the default language, then the linked translation or the menu without the language suffix is used.
= 0.294.220 =
* Changed: a menu chosen by hand in the settings is used as it is; only the automatically found menu is switched to the default language with WPML.
= 0.294.219 =
* Fixed: with WPML the site structure is built from the main menu in the default language, not from the menu of the language the admin screen is in.
= 0.294.218 =
* Fixed: attribute names sent for agency work stay as before (pa_color, pa_material), so colour and material are still recognised; hidden attributes stay out.
= 0.294.217 =
* Fixed: hidden product attributes (internal codes) are no longer sent to the AI text for agency work, and attribute names are sent as labels.
= 0.294.216 =
* Changed: the language version menu shows a flag, the language code and where the version lives (domain, subdomain or folder). The main language is always first and is no longer marked separately.
= 0.294.201 =
* Fixed: "Image name without the colour" knew only the base form of colours outside the dictionary (cream, golden...). "kremavi" did not count as "кремав". All genders and the plural are accepted now.
= 0.294.200 =
* Added: language switch in Content (old articles list) on a multilingual site.
= 0.294.199 =
* Added: language switch in Images and Rewrite on a multilingual site (WPML, Polylang). The lists show the main language by default; the chosen language goes with every request from the screen.
* Added: in Errors, with "All languages" each row shows its language (BG, EN).
= 0.294.198 =
* Fixed: a series joined by text is named by the words all its products share ("women's leather gloves with stitching"), not by the colour of one product. If the name is taken by another group, the old name stays.
= 0.294.197 =
* Added: each finding stores its language (from WPML or Polylang, otherwise by the address). On a multilingual site the Errors tab shows the main language by default, with a switch for the other languages and "All languages". Findings for the whole site are always shown.
* Added: the language goes to the agency with the findings.
= 0.294.196 =
* Added: language versions detection — WPML, Polylang, TranslatePress, Weglot, or hreflang tags without a plugin. System information shows the languages, the main one, the address of each and how they are split (folder, separate domain, subdomain, parameter). The plugin sends it to the agency.
= 0.294.195 =
* Added: product series are also found by text. Products with almost the same description but a different name ("... Exotic Wood DS-7107" and "... DS-3026") join one series under the name of the bigger group. The text fingerprints are kept until the products change.
= 0.294.194 =
* Fixed: on WPML sites with a domain per language, the content checks showed a translation with the address of the original (an English product listed under the Bulgarian address). The address is now in the language of the item itself.
= 0.294.193 =
* Changed: in Errors, a fix from the change log crosses out a row only if it was made after the start of the last full audit. An older fix that the audit still finds is shown as not fixed. A fixed row disappears with the next full audit.
= 0.294.192 =
* Fixed: the same finding row is written once (a variation with the parent product address, the shop as a page and as an archive showed twice).
* Fixed: privacy, terms, cart and similar pages are not reported as "missing from the sitemap". SEO plugins leave them out on purpose.
= 0.294.191 =
* Changed: a file name with no word of three or more letters counts as generic: 2, 240426_069, 201-11, L-379-35. WordPress and copy endings (-scaled, -300x200, -Copy-3) are ignored when checking.
* Fixed: the Images tab and the Errors tab use the same rules for generic names (UUID names were missed in Images).
= 0.294.190 =
* Fixed: speed findings skip the cart, checkout and account pages. They are not searched in Google.
= 0.294.189 =
* Fixed: in Images, an image is "ready" only when its alt is filled, not repeated on another image of the same page, and its file name is not a camera number. The waiting label says why.
* Added: "Same alt" column and filter in the Images list. The name check now covers the gallery too, not only the main image.
* Changed: file names made only of digits and separators (for example 240426_069) count as generic names.
* Fixed: in Errors, saving images one by one on a page lowered the counter once per image instead of once per page.
= 0.294.188 =
* Fixed: the sitemap check no longer reports the blog page, the shop page and post type archives as missing or not live when the SEO plugin lists them in another sitemap.
* Fixed: theme parts and page builder templates (Flatsome blocks, Elementor templates and similar) are not crawled. When they are in the sitemap, they are reported as a sitemap error instead of "page did not open".
= 0.294.187 =
* Added: one-click fixes in Errors for "Sitemap not in robots.txt", "Hero image lazy-loaded", "Canonical points elsewhere" and "Canonical missing".
* Changed: "H1 too short" is reported only for products and posts. Pages, categories and brands may keep a short name.
* Fixed: page type is found for addresses like ?product=slug.
= 0.294.186 =
* New: fixes straight from the Errors tab:
  - "Mixed letters" and "Cyrillic in the image file name": new file name field with the AI button; renaming adds a redirect.
  - "H1 too short" and "H1 too long": a field for the new page title (H1) with the AI button.
  - "Code shown as text": "Fix the code" button (straight quotes in the tag, code written as text becomes a link).
  - "Double space and mixed quotes": a button for the title, short description and meta fields.
  - "Image without size": "Add the sizes" button for library images in the page text.
  - "Invalid link": a field for the new address; empty removes the link and keeps its text.
  - "Links without text": a field for each link; the text is added as aria-label.
  - "Title word missing in the text": the AI suggests a sentence with the word, with a Copy button.
* Fix: WordPress emoji images are no longer counted as "Image without size".
= 0.294.185 =
* New: "Alt text same as the product title" lists every such image with alt and description fields and the Save and AI buttons, like "Same alt text on several images".
= 0.294.184 =
* New: groups of images in the Errors tab ("Same alt text on several images", "Images without alt text") have "Suggest for all" and "Save all" buttons. "Suggest for all" needs the AI module of Inside SEO Pro 0.4.262 or newer.
= 0.294.183 =
* Fix: a full site audit removed the speed findings, and they stayed "unchecked" until the next speed test. They are now rebuilt from the last speed test after the audit.
* Fix: the lab server response in the speed table showed a sentence from Google ("Root document took 4") instead of the time. It shows the time now (after the next speed test).
* Fix: "Code shown as text" showed the code as encoded text when the page stores it double-encoded. The code itself is shown and marked now.
= 0.294.182 =
* Fix: a link whose address is embedded code (for example "http://<iframe …>" with a Google map) was counted as a broken external link. It is now an invalid link, shown with its code. An address with an impossible domain is invalid too.
* Fix: the current meta title and description showed SEO plugin template marks ("%Title% %%"). They are now shown as on the page, so the AI also gets the clean text.
* Fix: "Mixed quotes" no longer counts quotes inside HTML code written as text, and the excerpt from the page text no longer marks spaces.
* New: "Code shown as text" — HTML code that the visitor sees in the page text, for example a link written with curly quotes (<a href=“…“>). The finding shows the spot.
= 0.294.181 =
* Fix: the "Speed" screen stopped with a fatal error (Call to undefined method SEOH_Speed::f()). A small helper used by the speed and plugin checks had been removed by mistake in an earlier clean-up. It is back, and a check over all four plugins found no other missing method.
= 0.294.180 =
* New: "Same alt text on several images" lists every image with alt and description fields and the Save and AI buttons, like the Images tab. A suggestion from the image analysis is in the field and the saved text is shown below it.
* New: "Mixed letters in the image file name" shows the file name with the letters from the other alphabet marked, and which letter it is (for example "Cyrillic: a, 2nd letter").
* New: "Double space and mixed quotes" shows the field and a short excerpt with the double space and the quotes marked.
* New: "Title = H1" has a field to rewrite the meta title, with the AI button.
* New: "Duplicate content" checks pages, posts and other public content (not products): the same or nearly the same text on several addresses. It runs in the "Duplicate products" step.
* New: "Redirect chain" (an address redirects to an address that redirects again) and "Slow server response" (pages that answered slower than 5 s during the link check) are now reported. "404 errors" is no longer listed as unchecked: it is followed only through Search Console.
* Fix: "Insecure resources (http on https)" counted every <link> in the head, such as rel="profile" from the theme, which the browser never loads. Only what the browser loads counts now: images and srcset, scripts, frames, video and audio, styles, icons and preload, and url() in styles.
* Fix: a link "http://" without a domain was reported as a broken external link. It is now an invalid link. Broken external links show the pages that contain them.
* Change: an image that is not in the library explains that, when it is on many pages, it is most likely in a shared theme section (an extra product tab) and the alt text is set there.
= 0.294.179 =
* Change: in the Images tab, a suggestion from the image analysis now shows in the alt text and description fields even when the site already has saved text, as long as it is different. The saved text is shown below the field as "now: ...". Before, the suggestion showed only in empty fields and the old text stayed.
= 0.294.178 =
* New: a link can open one finding in the Errors tab directly (the address ends with "&finding=<type>"). The monthly audit uses it for its "See all in Errors" links.
= 0.294.177 =
* Fix: opening the plugin could run out of memory: the list of fixed items read the whole change log into memory. Now the database returns only the last action for each item.
= 0.294.176 =
* Change: the contact e-mail in the plugin (signatures and contact details) is now contact@digitalmseo.com.
= 0.294.175 =
* Fix: all database queries are prepared with placeholders, with no exceptions (keyword trend, month summaries, near-duplicate products, block summary, AIOSEO noindex). The page card checks its security key in every request handler, and the selected channels are sanitised when read.
= 0.294.174 =
* Change: when a month summary is marked for recalculation, the plugin announces it (action seoh_month_summary_forget), so the saved monthly audit is rebuilt too.
= 0.294.173 =
* New: the 12-month charts in "Mirror" have a menu at the top right: Daily, Weekly (default) or Monthly. Weeks are built from the days. Keywords appear only in the monthly view. The header of the charts is smaller and further from the chart. Sales by day are kept in a new table and filled together with the month summaries (one pass over the orders of a month).
= 0.294.172 =
* Change: the month summaries for the 12-month charts are kept in their own table, one row per month. The current month is recalculated once a day, the last two finished months once a week and older months once a month. When new data arrives for an older month (a fetch from Google, a new client, "Recalculate"), that month is recalculated without waiting. On a shop the calculation runs in the background (the nightly task starts it); opening a page computes at most two missing months, newest first.
= 0.294.171 =
* Fix: the 12-month charts used a lot of memory: for every month they read the whole list of keywords and, on a shop, every order. Now a month is summed once and kept (new month summaries); keywords are counted in the database. The current month is refreshed every 6 hours, finished months once a week. On a shop at most two months of orders are summed while a page opens; the rest is filled in the background.
= 0.294.170 =
* Change: the 12-month charts in "Mirror" are taller (140 px instead of 80 px), so the lines are no longer flattened.
= 0.294.169 =
* New: "Mirror" shows two 12-month charts above the cards, in the style of Ahrefs. Sales: revenue, orders, average order and keywords, each on its own scale. Traffic: sessions of the four main channels, stacked. Hover shows the values for a month; the boxes in the legend hide or show a line.
= 0.294.168 =
* Change: the line charts in "Conversions and traffic" no longer have an empty strip on the left.
= 0.294.167 =
* New: in "Ranking" → "Positioning", every table has a small chart of the position over the last 12 months (green up, red down) and uses the full width of the screen.
* New: the page tables show "Conversions from Google" for each page: orders and their value, or the number of enquiries.
* Change: the line charts in "Conversions and traffic" are a third lower with thin lines. The headers of the large tables are 12 px and bold, and amounts no longer break onto two lines.
= 0.294.166 =
* Fix: the large admin class (about 8 MB of memory) was loaded on every page of the site, also for visitors: the monthly Search Console task and the admin bar link called it. They now live in small classes, and the start wizard loads only in the admin. Memory on a site page with only this plugin went from about 13 MB to about 5 MB above WordPress.

= 0.294.165 =
* New: a connected agency can show the new "Conversions" parts for this site: totals by payment date, orders without payment, the number of test orders, products sold only through ads, the value per enquiry, custom events and the number of form enquiries by form and source. Only totals travel; no names, emails or phone numbers.

= 0.294.164 =
* Change: the charts in "Conversions" and "Traffic" are line charts: the current period as a solid line and the compared period as a dashed line, with a tooltip for each day.

= 0.294.163 =
* Fix: the form enquiries block was titled "Queries" in English; it is now "Form enquiries".
* Change: the "Custom event" row in "Conversions by type" shows only when custom events are set.

= 0.294.162 =
* Change: the note about unpaid orders also counts orders in "Processing" without a payment date for more than 3 days (with cash on delivery: not delivered yet), and shows the status of each.

= 0.294.161 =
* Change: "By channel" draws thinner lines and shows the channel names as in "Traffic".

= 0.294.160 =
* New: "Traffic", "By channel" and "Ranking" show up to which day Google has data, and "Traffic" adds today's visits so far from the customer journey tracking.
* New: for sites without a shop, a value per enquiry can be set in the settings; "Conversions" shows the conversions in money.
* New: custom key events (name and CSS selector) in the settings, with their counts in "Conversions". Live chat clicks count as a conversion.
* New: "Conversions" lists the form enquiries (name, email, phone, page, source) when the Pro customer journey module keeps them, with a delete button.
* New: "Products" shows the products that sell only through paid ads.

= 0.294.159 =
* New: "Conversions and traffic" has a new "By channel" tab. A line chart compares chosen channels over time by sessions, orders, revenue or conversion rate, with a table of all channels and the change against the previous period. The data comes from the daily Google Analytics channel data.

= 0.294.158 =
* New: "Conversions" can count orders by order date or by payment date. The payment date gives the same figures as the WooCommerce report.
* New: a note shows orders on hold that have waited for payment more than 3 days, with their total and a list.
* New: an order can be marked as a test. A test order is left out of revenue, channels, products, money by page and the data for the agency; it stays in the "Orders" list, greyed, to undo the mark. Orders with "test" in the name or email get a hint.

= 0.294.157 =
* Change: new animated logo (sharper, Bulgarian and English), with a new still image.
* Removed: the two old GIF logos (about 410 KB); browsers without video now show the still PNG. The plugin package is about a fifth smaller.

= 0.294.156 =
* Performance: classes load on first use instead of all at once (autoloader). A normal request now loads about 40 plugin files instead of 118 and uses about 5 MB less memory.
* Performance: the current findings run number and the attachment lookup by address are remembered for the request. The Errors screen made 147 database queries; now 86.

= 0.294.155 =
* Removed: 56 functions nobody called (about 1,300 lines) — old screens and blocks replaced long ago, old cluster and storage helpers, unused image and redirect helpers, and small leftovers. The phone and address check stays.

= 0.294.154 =
* Change: one place decides between Action Scheduler and WP-Cron (SEOH_Cron::once, every, has, next_at, clear); the copies in the schedule, image renaming, speed tests, speed history and Search Console index check now use it.
* Change: Search Console and Analytics requests share one request and error-reading class (SEOH_Google_Api) instead of two identical copies.

= 0.294.153 =
* Change: error messages of the daily pull say "Search Console" and "Analytics" in plain words instead of internal names ("GSC matrix", "GA4 pagePath").

= 0.294.152 =
* Fix: with All in One SEO 4 and newer, a new meta title or description written by the plugin now reaches All in One SEO's own table, which the site reads; before, only the old copy field was written and the site kept the old text.
* Fix: with All in One SEO, the current meta title and description are read from its table.
* Change: a meta title or description that is a template of the SEO plugin (e.g. "#post_title #separator_sa") is kept when a series is saved, so it keeps following the product title.

= 0.294.151 =
* Agency: image deletion, speed check settings, speed email, wp-config constants, deleting an empty category, removing noindex and opening the site to search engines can now be done by the agency remotely. Each change is written in the change log as an agency change; an empty PageSpeed key from the agency does not erase the site's key.

= 0.294.150 =
* Fixed: a rewritten series task sent by the agency can be saved from "Pending tasks" on a site with only the free plugin. Title, descriptions, meta title and description and image alt texts are saved and logged in the change log.

= 0.294.149 =
* Agency: the freshness thresholds for GEO/AEO set by the agency are saved on the client site.

= 0.294.148 =
* Daily Google pull warning: when the automatic daily pull has not started for days but the data is still complete (filled in while the plugin screens are open), it is shown as a yellow warning that says so, not as a red error.

= 0.294.147 =
* Google connection: the "connection dropped" warning now appears only when Google has really revoked access, or after three failed checks in a row. A single network or hub hiccup no longer shows it for a whole day; after a failure the check repeats in an hour, and any successful token refresh clears it. The settings card shows the same state as the warning, and the warning says why (revoked by Google, signature mismatch with the hub, server clock, no connection to the hub).

= 0.294.146 =
* Summary by page: issues and spelling moved to the left, under the keywords. Traffic and conversions removed (they are in the number boxes). New speed box: mobile and desktop scores with LCP, INP, CLS, FCP and TTFB. When the page itself is not measured, the numbers come from a measured page of the same type (product for product, category for category), and the box says which page.

= 0.294.145 =
* Summary by page — new layout: eight number boxes on top like in Issues (position, clicks, impressions, keywords, visits, sales or conversions, issues, mobile speed, with the change since last month); keywords on the left; indexing and structure on the right; issues and spelling below; speed, traffic, GEO and the change log folded. The groups fold like in Issues "By page".

= 0.294.144 =
* Summary by page: issues and spelling now use the same look as Issues "By page" and Spelling — the same rows, the same explanation and the same fix fields, opened with "Fix".
* The Issues styles moved to their own file (admin/css/seoh-findings.css), shared by Issues and the summary.

= 0.294.143 =
* Summary by page: issues and spelling look like in Issues and Spelling. With the paid plugin they can be fixed right in the card: spelling fix or "not an error", mixed letters, hidden characters, long dashes, address, hidden page, https links, SEO title and description, image alt, and "Ignore in the report".

= 0.294.142 =
* Mirror: "Page card" is now "Summary by page" and sits under the sales and traffic boxes. The item list comes right after the type, then the search.
* The page card sections are in a new order: Structure and links (now with content and images), Rankings, Indexing, Issues and spelling, Speed, Traffic and conversions, GEO and AI, Change log. New look; the issues section shows its count.

= 0.294.141 =
* New: "Page card" in Mirror — choose a type, search, pick a page, product or category and see everything about it in folded sections: rankings, traffic and conversions, issues and spelling, indexing, content and images, links and structure, GEO and AI, speed, change log.
* Issues "By issue type": an image shown on many pages is one row ("shared — on N pages"); site-wide theme issues with the same detail are one row. Counts match the rows.
* Issues "By page": shared images are marked "shared — on N".
* Live page measuring keeps all images without alt, not the first 8.

= 0.294.140 =
* Fix: "Images without alt" now counts each image once, not once per page that shows it.
* Fix: a broken internal link is checked on the live page. Links that sit only in old database content (page builders) and are not shown are dropped.

= 0.294.139 =
* Fixed: English texts for the Google data volume card, the queue filters and two crawl steps.
* Changed: the page list for the "By page" view no longer turns off query filters (Plugin Check).
* Changed: readme keeps the last 20 versions; the full history is in changelog.txt.

= 0.294.138 =
* Changed: the content checks (links, link graph and orphan pages, clean URLs, link details, broken link targets) read every page instead of the first 1,500-2,000. They run in small parts across audit steps, so a big shop no longer hits the server time limit.
* Changed: no more sample limits in those checks: every URL problem (was 12 per type), every page with images without alt (was 300), every source page of a broken link (was 50) and every list item in a finding (was 100).
* Fixed: categories and tags were skipped by the content checks when one of the taxonomies did not exist.
* Fixed: large saved audit state could fail to save when a chunk cut a Cyrillic letter in half. The audit then repeated the same step without end.

= 0.294.137 =
* Changed: no more 500-row limits on findings. The Errors tab, the queue, the editor box, the agency view and the accepted list read every row.
* New: folders can be excluded from orphan files (service PDFs, invoices). The setting is in the Errors tab, under the orphan files finding, with quick buttons for the biggest folders.

= 0.294.136 =
* Fixed: the same finding no longer shows twice on one page in the "By page" view.
* Changed: theme-level findings (many CSS or JS files, third-party fonts, missing cache or compression headers) show once under "Whole site" instead of on every page.
* New: image findings show thumbnails in the "By page" view.
* Fixed: page titles with HTML entities show as plain text.
* Changed: "Checked and accepted findings" is now a collapsed accordion with a count.

= 0.294.135 =
* New: the "By page" view has filters on top: content type, subcategory, problem and search by name.
* New: spelling findings now show under each page, with the same fix and "Not an error" buttons as the Spelling tab.
* New: "Ignore in the report" works in the "By page" view too.
* Changed: "Other addresses" is always the last group.

= 0.294.134 =
* New: "By page" view in the Errors tab. Each page shows all its findings in one accordion, grouped by content type, errors first. The same fix buttons open right under the finding.
* Changed: the Errors tab no longer stops at 500 rows per finding type. All rows are shown.

= 0.294.133 =
* Own AI account: the model that answered is remembered and can be shown; more model name variants in the preference list.

= 0.294.132 =
* Own AI account: asks WordPress for a strong model (Claude Sonnet/Opus, Gemini Pro, GPT-5) instead of the first model in the provider list. The list can be changed with a filter.

= 0.294.131 =
* Own AI account: answer limits step 16000, 8192, 4096; big tasks wait up to 240 seconds; an answer that hit the limit is not retried with a smaller one.

= 0.294.130 =
* Own AI account: big requests get 150 seconds instead of the 30 WordPress gives by default; on a timeout the other attempts are skipped, so the request does not run past the server limit.

= 0.294.129 =
* Own AI account: big requests step down to 8192 and 4096 token limits instead of 1200, and a broken answer tries the next step instead of failing at once.

= 0.294.128 =
* Site crawl: a page whose address redirects to a missing address (or returns an error) is reported as "Page that leads to a missing address" and is no longer checked as a page - before, the theme's "not found" page was reported as missing canonical, two H1 and so on.
* Image names: products with a print or many colours (for example "Multicolour") are not checked for a colour in the image name.
* The crawl state, deep review rows, live page measurements, seen images, orphan images and the structure queue are kept in their own table instead of site options. Old values are moved over once.
* Questions and answers on category pages: shown after the products when the theme does not call the description hooks; only on the first page of the category, both on the page and in the schema.

= 0.294.127 =
* Site structure, "Update changes": pages whose SEO title or description was changed in the SEO plugin are refreshed too (the change does not move the page date, so they were skipped). The agency then counts by the current title.

= 0.294.126 =
* Code standards: the change-time column for the agency link is added through the tables' own descriptions (no direct table change).

= 0.294.125 =
* No caps on data: the deep review takes all addresses (was 20 000); live page measurements, seen images and renamed-image redirects are all kept (were 3 000, 20 000 and 5 000); all products, articles, categories, conflicts and words are read for content checks; image uses, alt fixes in text and link fixes reach every page; the indexability summary reads all published pages (was the first 2 000).
* Google index check: all checked addresses are kept (was 800); up to 1 800 checks a day (was 300; Google allows 2 000). Sitemap reading has no 3 000 address limit.
* IndexNow: more than 100 addresses are sent in parts instead of being cut.
* Agency link: each data page carries the site's current time, so a row changed while the agency is pulling is not lost. The site tells the agency its cart, checkout and account paths.

= 0.294.124 =
* Settings, database panel: row counts and last dates are remembered and refreshed after each crawl, structure, speed check and daily run; a button recounts on demand. The panel opens without counting every table.
* Agency link: six tables (accepted exceptions, money by landing page, speed history, Google speed, suggested articles and terms) now record when each row changed. The agency takes only new and changed rows, and removes rows deleted here.

= 0.294.123 =
* The site's own dictionary goes with requests to the agency for proofreading.
* Changes made by the agency show the agency's name in the change log, not the site owner's.
* Agency actions run without a pause by default; a site with a weak server can choose a slower pace.

= 0.294.122 =
* GEO: approved questions (FAQ) and the suggested schema no longer overwrite each other - the FAQ schema is built from the questions and printed separately; removing the FAQ keeps the other schema.
* GEO: when suggesting questions or a schema fails, the reason is shown.
* Our screens show our own warnings again: Google connection lost, site address changed.
* Warning when Google is connected but no Search Console property is selected for this site (the numbers stay zero).

= 0.294.121 =
* Settings, update dates: the crawl row shows when the last crawl finished and how many pages it reviewed (it stayed empty).

= 0.294.120 =
* Google data without caps: all page-by-query rows, all queries and all pages are taken in parts (before: 50 000, 5 000 and 25 000). If a part fails midway, nothing is overwritten. GA4 breakdowns take all rows (before: 100 and 1 000).
* If a Google import ever stops at the memory guard, System info shows what, for which period and how many rows were taken.
* Marks of done work: all of them are read (before: the first 20 000).
* Mixed letters, long dashes and icons: all published pages are checked, in parts (before: the first 5 000, and at most 500 pages per finding).

= 0.294.119 =
* Agency: the site learns its agency's address from a signed command, so it can send its notices. Before, sites that had never received a task did not know the address and stayed silent.

= 0.294.118 =
* Agency: when a crawl, the page structure, a speed test or the Google import finishes, the agency is told at once. It then asks what is new and takes only that. The notice carries no data.

= 0.294.117 =
* All in One SEO: page titles and descriptions are read from it too (the page structure and the "is it still wrong" check saw nothing).
* A title or description changed on our screens or in the SEO plugin updates the page structure at once - the agency counts by fresh values.

= 0.294.116 =
* Orphan images: category images (product categories and others) count as used.

= 0.294.115 =
* Orphan images: the list of images is made in its own step and every small part is saved at once - a step stopped by the host continues from where it was, not from the start (the crawl stayed long at 98 %).
* Orphan images: the crawl's own saved progress is no longer searched - every image was "found" there. After a crawl the per-image text search and the field search by file name are skipped; what the crawl saw on the live pages decides.
* The crawl summary shows how long the crawl took.

= 0.294.114 =
* Agency: the findings cursor carries the crawl. After a new crawl the agency pulls the findings from the start. Before it kept the old place and got only the end of the audit.
* Main image: footer and sidebar are matched as whole class names. A main column named "sidebar-right" no longer hides the content images.
* Colour in the file name: "bejova" and "bezhova", "tymno" and "tamno" both count.

= 0.294.113 =
* Title word missing from the text: the word is also looked for in the product attributes ("Colour: Black") and in the address, in Latin too.
* File name without the colour: "tamnokafyava" counts as "dark brown" - dark and light prefixes are accepted.
* Thin content: a zero from the live page is not trusted when the text is there - the count from the site is used. All published pages are checked (was 1 500).
* Main image delayed: images in the footer, sidebar and widgets are not taken as the main image.
* Broken external links: a site that refuses the check (403, 405, 429) is asked once more as a browser; if it refuses again, the link is not counted as broken.
* Alt text = file name: only when the alt looks like a file name (words joined with dashes, no spaces). The row shows the alt text.
* Address ending in "-2": clearer text - most often separate products with the same name.

= 0.294.112 =
* Screens: explanatory sentences removed (Mirror, sales, crawl, errors, settings, data). Dates and volumes stay.
* Site errors: the count is the real one when a check has more than 500 rows (was shown as 500).

= 0.294.111 =
* Deep review goes through the site itself: published, visible pages and posts and non-empty visible categories of the selected groups. The sitemap is compared with them.
* Two new checks: "Sitemap address that is not on the site" (deleted, draft, trash, noindex, empty category) and "Page missing from the sitemap".
* noindex is read from All in One SEO too, and for categories from Rank Math, Yoast and All in One SEO.
* Orphan images and files: the search runs in parts across the crawl steps, over all attachments (was the latest 2 000, at most 300 found). Image name checks cover all images (was 2 000).
* Agency: while the crawl is saving its findings, the site answers "busy" and the agency keeps its data and asks again in five minutes.

= 0.294.110 =
* Site crawl: the "Where the crawl time goes" tables are removed from the screen.

= 0.294.109 =
* Findings show the real count, not a cap. Duplicate product series: all products are compared (was the first 3 000) and big series are no longer skipped (was over 60 products). Deep review: every page is saved (was 20 per check), in parts at the end of the crawl. Link details (was 30), orphan and hard-to-reach pages (was 30), thin pages (was 200), extra checks (was 500 per check and 5 000 pages and images), robots.txt against the sitemap (was the first 1 000 addresses).

= 0.294.108 =
* Rewrite page: the series count is the same as in the errors and the audit. Two separate series under one product name were counted as one.

= 0.294.107 =
* Site crawl: the first step scans the sitemaps again. Counts and parts are fresh, vanished sitemaps drop out, new ones of a selected kind are selected. The counts from the scan are no longer overwritten.
* Deep review: a sitemap split in parts (product-sitemap.xml, product-sitemap2.xml) is read in full. Before only the first part was read and on a shop with 1 566 products only 1 000 were checked.
* Deep review: up to 20 000 addresses (was 3 000).

= 0.294.106 =
* Deep review: the shop cart, checkout and account pages are recognized by their address, also when they have Bulgarian names (kolichka, porachka, moyat-profil), and are not checked.
* Crawl screen: the counts next to the groups were refreshed from the crawl (reverted in 0.294.107: the counts come from the sitemap scan).

= 0.294.105 =
* Deep review: when the sitemaps do not answer, the list comes from the site structure (same selected groups, categories and tags included; without noindex, service and empty term pages), before falling back to the database.

= 0.294.104 =
* Orphan images: if the database does not accept the combined search, each image is checked the old way, so a used image is never reported as an orphan.
* Deep review: the hreflang data is kept for a week, so a slow crawl still checks the return links.
* Crawl summary: says how many pages the deep review checked, and when the sitemaps did not answer and the list came from the database.

= 0.294.103 =
* Deep review: pages are fetched one by one while the step has time (up to 15 s), not 8 at a time; a slow page can no longer push a step past the host limit.
* Orphan images: one search covers 300 images instead of 100.
* Sitemap check: each sitemap is fetched once per step (it was fetched up to three times).

= 0.294.102 =
* Deep review: when the sitemaps return no addresses (the site did not answer its own request in time), the pages come from the database instead of checking 0 pages and losing the deep findings.

= 0.294.101 =
* Orphan images: the search in fields and settings runs once per 100 images instead of once per image (3 table passes per image before). Same result, much faster on sites with many orders or images.
* Site crawl: the step "saving findings" is called "last checks and saving", since the checks before saving take the time.

= 0.294.100 =
* Site crawl: the orphan image search (the slowest part of saving findings) shows where its time goes: live page checks, search in page text, file and ID search in the fields.

= 0.294.99 =
* Site crawl: "Where the crawl time goes" also shows saving the findings up close: the heavy checks (orphan images, image names, mixed letters, hidden characters) and the writing per finding type, with the lookups by address.
* Saving findings: the object behind an address is looked up once per request, not again for every finding type.

= 0.294.98 =
* Site crawl: a late request from an older crawl can no longer overwrite a newly started one (each crawl has its own mark). The progress bar says when the crawl stopped instead of freezing.

= 0.294.97 =
* Site crawl: the last step is split into parts (content, real words, saving findings, extra checks in chunks). Before it was one long request; on big sites the host stopped it and the crawl stood at 98 %.
* Site crawl: a step that dies (time or memory limit) is noted with its name and reason, counts as a failed try and unlocks at once. A log keeps the last 50 steps with time and memory.
* Site crawl: "Where the crawl time goes" under the progress bar: each step with times run, total, longest and stops, plus the waiting between steps.
* Deep review: the page list is kept for a week, not an hour, so a slow crawl no longer "finishes" halfway.

= 0.294.96 =
* Errors: "Reasons from Search Console" counts only problems (indexed pages stay in the list but are not counted) and stands right after "Not seen by search engines", or on top when there is none.

= 0.294.95 =
* Deactivating the plugin stops all its scheduled jobs; they start again when it is turned back on, including the hourly agency check.
* The monthly Search Console check is scheduled correctly on sites without Action Scheduler.
* "Off" for speed history now stays off.
* Cleanup of 404 records, AI bot visits and removed pages uses the same clock as the records.
* The IndexNow key file works on a fresh install without saving permalinks.
* The "No sitemap selected" banner also clears when the sitemap is chosen in Settings.
* Paid tabs in the top bar show only when their module is loaded; the "Fix in …" button shows only with the write-back module; links to the paid analytics show only when it is there.
* System information highlights its own tab.
* An image row no longer says "could not open" when the image loaded.
* Removed pages are recorded in one place with reason and title; small clean-ups in the agency hello and schedule saving.
* The shop currency travels to a connected agency, so it shows prices in the same currency.

= 0.294.94 =
* Near-duplicates: the finding is called "Series of near-duplicate products" and counts series, as in the monthly audit. The make-unique list shows both: products and the series they are in.

= 0.294.93 =
* The notices about the site check say "site crawl" ("The site crawl is running", "stopped halfway", "failed"), so they are not mixed up with the monthly audit.

= 0.294.92 =
* Site check: a step that fails is tried again. Before, it was skipped quietly, the check finished without its data and whole kinds of findings disappeared (for example near-duplicate products).
* System info: the Analytics channels row has its name.

= 0.294.91 =
* System info: how much data comes from Google per day for the last 30 days (Search Console pages and queries, Analytics breakdowns), the limit, and on how many days the limit was reached. The agency sees the same numbers.

= 0.294.90 =
* Agency link: writing, queue and commands from the agency need the agency's signature, not only the link code. The agency's public key comes from the hub. Until the key arrives, it works as before. A stolen link code can no longer write to the site.
* Make unique list: "analyzed" also shows analyses made by the agency. New filter: with analysis, with proposal, with neither.

= 0.294.89 =
* Site check: the link check works in short parts (about 20 seconds each). Before, a batch of slow links could run longer than the server allows, and the check stopped halfway.
* Site check: if a step dies anyway, the check goes on by itself after about 6 minutes, without a manual restart.

= 0.294.88 =
* Agency queue: the agency can now take series analysis tasks. When the agency analyzes a series, this site remembers it, so the rewrite can go to the queue.
* Agency queue: the rewrite keeps its series and comes back for review as a full product, with image names and alt texts.
* Agency queue: under an agency, "Run" and the night run hand the tasks to the agency. It takes them within about 30 minutes. The confirmation no longer shows this site's credits and prices - the agency pays.
* Agency queue: if the agency stops (no AI credits, limit), the task goes back to waiting instead of failing.

= 0.294.87 =
* Make unique list: the column now shows how many products the series has (with the product itself), not how many others are similar.

= 0.294.86 =
* Change log: paging with First, Back, a page number box, Next and Last. Paging and filters now keep working past the first page (the links had lost the read key).
* Change log: new filter "Effect in Google" - improved, worse, no difference, waiting (under 30 days), no Google data.
* Change log: shows how many rows it holds and about how much space. Full product texts are kept 90 days for undo, then shortened; rows are kept 24 months.

= 0.294.85 =
* Audit: "Only one internal link" and "Broken internal links" moved to "Slowing down ranking". The page is still seen; it just carries less weight.
* Audit: 404 errors are now taken only from Google Search Console. The live 404 catcher also logs bots and old bookmarks, so it no longer counts in the audit.
* Audit and index check: images, documents and theme or page-builder templates (for example Flatsome blocks under /blocks/) are no longer treated as pages, even when the sitemap lists them.

= 0.294.84 =
* Spelling: each note is easier to read. The mistake is on the first line in red. Under it is the sentence where it stands, as a quote, with the mistake underlined. Then the type and the field in bold with the explanation, and last the fix in green with the buttons.
* Spelling: the hint for "Fix by hand" is shown on its button again, not printed elsewhere on the page.

= 0.294.83 =
* AI: the check whether the site's AI provider works no longer sends a paid test request. It only asks WordPress whether a text model is set up. When a real request fails, the plugin remembers this for 10 minutes.

= 0.294.82 =
* Audit: the questions before a fix are asked inside the page, with clear buttons ("Add to the queue", "Replace everywhere", "Fix", "Move to draft", "Delete for good" / "No"). No browser OK/Cancel window.
* Change log: saving or removing questions and answers, the llms.txt choice, ad data and AI suggestions are now written to the change log.
* Speed test (PageSpeed): works on sites without Action Scheduler. It uses WP-Cron when Action Scheduler is not there (for example, a site without WooCommerce). Before, the button said the test could not start.

= 0.294.81 =
* Row writes cut long texts to the column size first, the same way the database did before. One long page title no longer stops a whole batch.
* Uninstall runs in functions, deletes options through delete_option(), and also removes the plugin's own term notes.

= 0.294.80 =
* Database queries pass every value separately to the prepare step. Batch writes go row by row through the WordPress insert and replace helpers, inside one transaction.
* Table upgrades use dbDelta only. No ALTER or DROP outside uninstall.

= 0.294.79 =
* The plugin no longer defines WordPress core file-permission constants; file writes and copies give the permissions themselves.

= 0.294.78 =
* llms.txt: page titles and descriptions are cleaned to plain text before they go into the file. The file is served as plain text with a no-sniff header.

= 0.294.77 =
* New agency door for category and tag pages: create or find the term, write its text, meta text, featured image and attached products. Every step goes into the change log.
* The agency can keep a suggested meta text next to a page, so the audit box keeps it.
* The page material for the agency now includes the product price and code, and the full text for article review.
* Missing English translations added.

= 0.294.76 =
* The agency plugin can now read, save and remove the FAQ block and read the saved schema of a page, through the same signed and checked connection.
* The agency view now includes the menu tree and the image renames that are still waiting.

= 0.294.75 =
* Faster screens: reads from the plugin's own tables go through the WordPress object cache. Any write to these tables clears it at once, so the screens always show the current data. With a persistent object cache (Redis, Memcached) the saving carries over between page loads.

= 0.294.74 =
* Internal rename of two link and page list helpers (the old names still work). No visible change.

= 0.294.73 =
* Speed, file rules: the "keep only on chosen pages" list for ordinary pages shows again.
* A connected agency can read your page list for that choice.
* The Google sign-in redirect uses wp_safe_redirect() with only the two Google addresses allowed.

= 0.294.72 =
* Code review clean-up (screens work as before): no output buffering on the screens, a nonce on every admin screen address and GET filter form, a nonce on the front-end speed probe and file-rules preview addresses, the Google connection return finished through a form with a nonce.
* The wp-config.php texts now say what really happens: the original is kept in memory, not copied to disk.

= 0.294.71 =
* A connected agency can now save, on your site, what it sets for you: the file rules in Speed, the llms.txt selection, suggested questions and schema (they wait for approval as before), and your ads figures. Everything is written here and listed in the change log as before.
* Fixed a PHP notice on the GEO/AEO screen.

= 0.294.70 =
* New checks in the Errors tab: a past year in the text used as if it were the present; a title word that does not appear in the text; a page that is not in any menu.
* A check for phone numbers and addresses written differently across pages is prepared but not switched on yet.

= 0.294.69 =
* New checks in the Errors tab: title starting with a lowercase letter; double spaces and mixed quotes; address ending in "-2"/"-3" when the same address without the number exists; product without a price or an image; image alt text equal to the product title; the same alt text on several images on one page; Cyrillic in an image file name; mixed alphabets in an image file name; image in the text without width and height.
* Each new check has a help text, is counted as done from the change log where possible, and is checked again by "Check the changes".

= 0.294.68 =
* New: the connected agency can create a draft post on the site (title and a featured image from the site's media library), add text to it in parts, and read its state. Only new drafts it created itself; nothing published is touched. Every step goes to the change log and can be undone (an undone draft goes to the trash, it is not deleted).
* Fix: text sent by the agency keeps backslashes.

= 0.294.66 =
* Fix: the "Run structure now" button (and the matching agency action) no longer fails.
* Fix: speed "before/after" snapshots are saved again; the period column is widened on existing sites automatically.
* Fix: the check for an incomplete upload now covers every plugin file.
* Security: Google tokens, the site signing key, the PageSpeed key and the agency link code are also stored encrypted. Existing connections keep working; the old copies stay as a backup for this version.
* Security: all agency endpoints use one shared check. Live actions and the queue accept only fresh requests and only from the remembered agency address. A new link forgets the old agency address.
* Security: the hello endpoint gives environment and counts only over HTTPS, with an active link and consent. The hub summary also requires an active link.
* Security: after a site address change, the hub summary pauses together with the agency endpoints until the owner decides.

= 0.294.65 =
* Agency connection: the hourly status check sends the connection code, and a shorter answer from the hub no longer clears the agency contact details shown in the Agency tab.

= 0.294.64 =
* Code review clean-up. Screens and data work as before.
* SQL: every table and column name goes through the %i placeholder; IN lists and bulk inserts use placeholders; filters are fixed SQL with placeholders.
* Input is sanitised where it is read; data from json_decode() is cleaned value by value.
* Inline scripts and styles go through wp_add_inline_script() / wp_add_inline_style(); the consent page loads its CSS from a file.
* File operations go through WP_Filesystem; wp-config.php is never copied to disk.
* The HTTP/2 check no longer calls cURL directly.
* Output buffers are closed in a finally block; every handler that changes data checks its nonce and capability itself.

= 0.294.63 =
* The change log now keeps the full product title and both descriptions when the agency rewrites a product series, so the change can be undone from the log. The short description keeps its formatting when written by the agency.

= 0.294.62 =
* The monthly GA4 breakdowns now also keep engaged sessions, average engagement time and key events, and add traffic source/medium and top products, so the full monthly report can be built from the stored data. No change in behaviour.

= 0.294.61 =
* Housekeeping: cleared the remaining Plugin Check findings (removed a few no-op translation wrappers, tidied admin input handling, and annotated the internal database queries in the new data layers); softened the wording about the optional companion plugin, dropped a version-specific note, and show the name consistently as DigitalM Inside SEO. No change in behaviour.

= 0.294.57 =
* New: removed pages list - every removed page, product, post or category with its Google clicks and impressions, ready to redirect or mark as gone (410); real 404 hits are caught live.
* New: site move detection - when the site moves to a new address, the plugin pauses what is tied to the old one and asks what to do.
* New: optional IndexNow notifications on publish and update (off by default).
* New: optional connection with an SEO agency by invitation, with a consent page, a change log and a one-click disconnect.
* New: "Something not working?" form on the Guide screen, sent only on click; with your account email and consent it becomes a support ticket.
* New: a "More of our plugins" page that lists our other free plugins from WordPress.org; nothing is installed without your click.
* Improved: over 120 error checks, clearer texts, full English interface, and all browser pop-up dialogs replaced with on-page messages.
* Improved: a red warning when Google is connected but the last data download is more than two days old.

= 0.272.8 =
* New endpoint /wp-json/seoh/v1/agency/data — an agency you are connected
  to can read the rows behind the numbers: findings, Google history,
  monthly and daily rankings, the change log, and daily journey figures.
  Paged, incremental, ETag-cached, HTTPS only.
* Page content, individual orders, individual visitor sessions, Google
  keys and passwords never leave through it. The change log gives what
  was touched, not what it says.

= 0.272.7 =
* Fixed the audit and the structure crawl appearing to run on every admin
  page load. A run that died mid-way left its "running" flag up forever,
  and the browser kept pushing it. Both now go stale after 30 minutes of
  no progress, and the audit stops after three failed attempts.
* Structure progress is now counted per item, not per batch, so a single
  broken page no longer makes the counter stick at the same number.
* The daily structure crawl was scheduled by default and ran the full
  wipe-and-rebuild. It is now off by default, and when on it runs the
  incremental pass.
* Fixed a wrong class name (SEOH_HubSender) that made licensed sites run
  the heavy full crawl instead of just sending data to the hub.

= 0.272.6 =
* The Agency tab now lets you give the data-sharing consent after the
  connection was made. Connections created before that consent existed
  were silently refusing every request.

= 0.272.5 =
* The agency connect page now spells out exactly which data the agency
  will receive, what it will not receive, and how the exchange works.
  A second, separate consent box is required.
* Consent is stored with a timestamp and shows in the Agency tab.
* Without that consent the summary endpoint refuses, even with a valid
  connection code.

= 0.272.4 =
* Fixed a hang when the hub lives on the same site: the plugin no longer
  makes an HTTP request to its own server, which blocked the worker
  until the request timed out. It now calls the hub in-process.

= 0.272.2 =
* Agency summary endpoint now reads the connection code from the
  X-SEOH-Agency header instead of the query string, so the code no longer
  leaks into server and proxy logs.
* The endpoint refuses plain HTTP requests.

= 0.270.5 =
* New: reviewed and accepted issues - mark a finding as reviewed with a reason and a note, so it drops out of the count, the plan and the score but stays in its own table; postponed ones return after their date.
* New speed checks (main image lazy-loaded, oversized or old format; several oversized images; third-party fonts; missing font-display; missing preconnect; tracking before consent) and a new "external calls" server measurement.
* New: an optimization log that records each speed and file-loading rule change with the before/after numbers, plus a per-page view of which CSS and JavaScript load where, cache-plugin detection and a warning when another optimization plugin is doing the same job.
* Keyword impression counts now match Google Search Console exactly, and traffic figures are shown against the previous period.
* Documentation: the readme now describes the above. This release also carries the earlier Plugin Check clean-up (file-level annotations on internal data-layer queries, recommended WordPress file functions, unslashed and sanitized admin inputs, a translators note) with the stable tag aligned to the version. No change in behaviour for the code-quality items.

= 0.267.10 =
* English interface completed. The Spelling screen and its whole panel are now translated, along with a set of labels that were still showing in the source language: the database table names on the System information screen, the "Orders" metric, and the broken-install notice. Every interface string in the plugin and its scripts now has an English translation.

= 0.267.9 =
* Plugin Check: the proofreading data layer now suppresses the direct-query warnings at file level (internal core tables, all values through prepare), clearing the last "incorrect number of replacements" warning on its post lookup.

= 0.267.8 =
* Plugin Check: aligned the stable tag with the plugin version; the new proofreading and task-queue data layers now suppress the direct-query warnings at file level (internal tables, values passed through prepare); the proofreader AJAX handlers note that the nonce and capability are verified in their guard; and the queue on/off, URL and ID inputs are now unslashed and sanitized.

= 0.267.1 =
* Money is no longer taken as proof that the meaning check succeeded - a truncated answer is paid for too. The flag travelling with the answer decides; the cost is only consulted when talking to a hub old enough not to send one. This is what was wiping grammar and style notes on a re-check.
* A single-item check reports the real number of texts read instead of always saying one.

= 0.267.0 =
* A re-check no longer erases what only the model can find. Grammar, meaning and style notes survive a pass in which the meaning check did not run - because it failed, was switched off, or the limit was gone - instead of being wiped by the dictionary-only result. They are dropped only when a real meaning pass replaces them.

= 0.266.99 =
* The Fix button no longer appears on advice. A model answering a grammar note sometimes returns an instruction - "lower case for common nouns and finish the sentence" - rather than replacement text, and writing that into the page would destroy the sentence. A suggestion now earns its button only if it reads like a literal replacement: short enough, no brackets, quotes or "e.g.", and sharing at least half its words with the text it replaces. Everything else says "fix by hand".
* The same test runs server-side, so an old page left open in a tab cannot push advice into the content either.

= 0.266.98 =
* A run that was charged for is a run that happened. If the hub billed the request, the meaning check is reported as done even when the flag travelling with it says otherwise - which it could, when an older paid plugin passed the hub's own "I handed this to the site" marker straight through.
* When it really did not run, the line now names who was asked and how many texts were sent, so the reason is on screen instead of guessed.

For older versions, see changelog.txt in the plugin folder.

= 0.266.97 =
* "Do we have a working local AI" is now answered by asking it, not by trusting its own claim. Some providers report that text generation is supported and then match no model to any real request. The answer is cached - six hours for yes, ten minutes for no - so it costs a couple of tokens a day.

= 0.266.96 =
* One more fallback for "No models found": a separate system instruction is itself a capability the provider has to declare, so the last attempt folds the rules into the task text and asks without one. Four ways are now tried in order before giving up.
* When it still fails, a live probe runs four one-word requests and reports which way of asking the provider accepts - or the exact error for each - instead of a generic "check your settings".

= 0.266.95 =
* "No models found that support text_generation" is fixed at the source. The requested output ceiling is part of what WordPress matches models against, so a request asking for more than the provider advertises finds nothing. The call now retries with a smaller ceiling and then with none at all before giving up.
* Provider errors are translated: no matching model, provider quota reached, no credit - each gets a plain sentence saying what to do instead of the raw English message.

= 0.266.94 =
* The Spelling screen says out loud whether the meaning check happened. A green line - "meaning check ran through your AI account, 4 texts" - or a red one carrying the exact reason it did not. No more guessing from the absence of findings.

= 0.266.93 =
* The Spelling run shows what it costs while it runs: total spent and the average per item, measured from the actual run rather than estimated. Checking a single item reports its own cost too.

= 0.266.92 =
* A search box next to the item dropdown in the Spelling tab. Typing narrows the list as you go, so one product out of six hundred is two keystrokes away instead of a long scroll. It counts what is left, keeps the current selection if it still matches, and clears itself when the type changes.

= 0.266.91 =
* Findings are now an accordion, like the task queue: content type on top, each checked item under it, and every item keeps its own notes. Types open, items closed, counts on both levels.
* Each note shows the sentence it was found in, with the offending words highlighted inside it, so the place is visible without opening the editor.

= 0.266.90 =
* The Spelling tab is a hook, not a locked door. It appears only when the paid part has attached itself; without it there is no tab, no greyed-out button and no mention of a paid feature anywhere in the free plugin, exactly like the Pending tasks tab.

= 0.266.89 =
* Spelling check now sends only the human text. Shortcodes and their attributes, editor block comments, inline styles and scripts, CSS rules, key=value settings, links, e-mail addresses, base64 strings and letter-plus-digit codes are all removed before the text leaves the site. A page-builder page was reporting theme settings as spelling mistakes; it now reports only what a reader would see.
* The original field is untouched by this - cleaning happens on the copy that is checked, so a fix still writes back into the real content.

= 0.266.88 =
* A used-up monthly limit no longer stops the spelling run. The meaning check switches itself off, the batch is read again with the dictionary and punctuation - which cost nothing - and the run carries on to the end. The message now matches what actually happens.

= 0.266.87 =
* Spelling tab tidied: the two explanatory paragraphs are gone, the button reads "Check", the meaning checkbox says it needs an API key, and the re-read checkbox now says what it does - check the ones already checked - with the full explanation on hover.

= 0.266.86 =
* Spelling tab reads like a teacher marking an essay. Each finding is tagged by kind - spelling, grammar, punctuation, meaning, style - with its own colour, and shows the sentence it sits in.
* The free layer now includes punctuation, so a run without the paid full check already catches spacing and unclosed brackets.
* With the full check on, objects are read three at a time instead of ten, because whole descriptions are sent for marking.

= 0.266.85 =
* Spelling tab: a type filter and a second filter for one specific product, page, post or category - the same pair as in Uniqueness. Pick an item and only that item is read, straight away, whether or not it was read before.
* Audit tabs reordered: Errors, Speed, Images, Content, Uniqueness, Spelling, Pending tasks, Log, Crawl.

= 0.266.84 =
* The Spelling tab sends the site's language along with the text, so the Bulgarian dictionary is only applied to a Bulgarian site.

= 0.266.83 =
* New Audit tab: "Spelling". It reads the text already on the site - products, pages, posts and categories - across title, short description, description and the meta texts, and lists what is wrong with a suggested correction.
* Nothing is changed on its own. Each note has a "Fix" button that replaces that one word in that one field, keeping the capital letter, and a "Not an error" button that remembers the word for good.
* Each object is read once. A fingerprint of its text is stored, and it is read again only if someone changed it, so a second run over a large catalogue is nearly free.
* Words the shop itself uses everywhere are never called errors - brands and model names are skipped automatically.
* The category name is never rewritten from here, because it moves the address.

= 0.266.82 =
* Queue rows show the guard's notes. When the hub flags an expression that is not said that way in Bulgarian, the row carries a yellow box with the phrase, the reason and the better wording, right above the Save button.

= 0.266.81 =
* The image title in the media library is written too. Until now only the alt text and the description were saved, so the title stayed the camera number - "250228_205_1". It is now taken from the alt text, shortened to one clean phrase, and written at the moment you save that image.
* A human written title is never touched. The title is replaced only when it is empty, has no real word, repeats the file name or is a camera pattern like IMG_2201.
* The attachment slug stays as it was, so no address changes and no redirects are needed.
* A rename fixes the title too. Nothing runs in bulk and nothing runs on its own - one image is touched only when that image is saved.

= 0.266.80 =
* New shop vocabulary: the words this site actually uses, collected from product titles, categories, tags and attribute values, cached for a day. It exists so the text checks do not have to be written by hand for every shop.
* It also builds a stem index, so a word can be matched to the shop word it was derived from - "norkova" to "norka" - even though neither is a prefix of the other.

= 0.266.79 =
* Images tab: three checkboxes decide what gets written - file name, alt text, description - the same way the Uniqueness screen lets you pick fields. They apply both to "Save" on a single row and to "Save all filled in". An unticked field is left exactly as it is on the site.
* The search results now mark images that already have an earlier analysis with a green "suggestion ready" badge, so you can see before ticking which ones cost nothing.

= 0.266.78 =
* An image that already has an earlier Vision analysis no longer pays for a second one. When such an image enters the queue it goes straight to "waiting for review" with the stored suggestion, and the message says how many came for free.
* The search now also explains an empty image result: "the site has N such images, but all N are already waiting in the queue" - which is what "no generic file names found" actually meant while 195 image tasks were sitting in the queue.

= 0.266.77 =
* The queue's meta problems were named "Title missing / too long / too short", which reads like the H1 findings next to them in the Errors tab. They now say "Meta title", so a count of 6 for "H1 too long" is not mistaken for the meta title finding, which had 1.
* An empty search result now explains itself: how many findings the audit has for that type and why none of them qualified - already queued, address does not resolve to a page on this site, or a different content type.
* A finding address that is percent-encoded is now also tried decoded before giving up on it.

= 0.266.76 =
* Pending tasks is now two clearly separated parts. The top one, "Add to the tasks", searches the SITE by content type and problem type, lists what it finds with a tick per row, and adds the ticked ones to the queue. Things already waiting are left out of the results.
* The bottom part, "The task queue", is always fully visible and is only for processing. The content-type and problem filters no longer narrow it - they belong to the search above. Only the state filter and the six counters narrow the queue.
* The run button follows the same rule as before: with rows ticked it runs only those, otherwise everything waiting.

= 0.266.75 =
* The confirmation before a run now shows money, not just a request count: the estimated cost in euro, how much is left this month, and a warning when the job is bigger than the remainder. An article counts as about ten requests, a meta task as up to two, an image as one - so the estimate matches what is actually spent.
* When the hub has no price list yet, the wording falls back to counting requests instead of inventing a sum.

= 0.266.74 =
* Errors tab: tick individual rows and press "Add the ticked ones to the queue". The old button that took the whole finding is still there, next to the explanation.
* Fixed items now disappear from the Errors tab as soon as the queue writes them, instead of waiting for the next audit. Nothing is removed on trust - the page is re-checked live, and the row stays if the problem is still there. A renamed file is re-checked after the rename actually runs.
* The "Add to the queue" button under a finding no longer fires several times. Its handler was attached on every redraw of the explanation panel, so the request piled up.

= 0.266.73 =
* The night checkbox is renamed. "run at night too" said what the plugin does, not what you get; it now says "process in deferred (night) mode", with a tooltip explaining that saving to the site still waits for you.

= 0.266.72 =
* "Run the queue now" now respects what you ticked. With rows ticked it runs only those - at any of the three levels - and the confirmation says how many. With nothing ticked it works by the filters, as before.
* The queue can be restricted to an exact list of task ids, which is what makes the above possible.
* The tick column in Images and Uniqueness is hidden when the paid part is not installed. Without it there is nothing those ticks could do.

= 0.266.71 =
* The run button now says "Run the queue now" instead of "Run by this filter", with a tooltip and a line below it: this is the only button that calls the AI and spends requests, it runs in the background, and it processes whatever matches the filters above.

= 0.266.70 =
* Clearer wording in Pending tasks. "Approve and save the selected" is now "Save to the site", "Decline the selected" is "Do not save them", and "Remove from the queue" is "Delete from the queue". Each button has a tooltip and there is one line under them explaining all three.
* Declining a whole level now covers ready suggestions too, not just the ones still waiting. Before, a ready suggestion survived the decline and could be written later by accident.
* Fixed an undefined variable when a bulk action was run on individually ticked rows.

= 0.266.69 =
* The Mirror no longer prints a PHP warning inside the "Indirect sales" card. The channel rows come from the hub and can arrive in a different shape; a row without a name is skipped, and the name is also read from inside the row when the hub sends a numbered list.

= 0.266.68 =
* New kind of task: a new article. The queue holds a finished skeleton, shows it for review, and starts writing only when you press "Write the text". The draft is created empty at the moment of queueing and nothing is published at any point.
* The article row shows the plan, how far the writing got, and a link to open the draft.
* The list of findings the queue can take moved into one shared place, so the Errors tab and the monthly work plan offer the same set.

= 0.266.67 =
* Meta titles and descriptions are now a kind of task. "Add to the queue" in the Errors tab works for missing, too long and too short titles and descriptions; the page itself is the target, not an image.
* Duplicated titles and descriptions deliberately stay out: they are a group problem and belong with the uniqueness work, not with one page at a time.
* Reasons merge. A page already waiting because of a long title keeps that reason when it also enters because of a missing description.
* A page already waiting for uniqueness is skipped - the meta texts are written there anyway.
* The review row for a meta task shows the current text with its length and an editable field for the new one; "Save" writes into the active SEO plugin (Rank Math, Yoast, SEOPress, All in One SEO).
* Writing meta into the SEO plugin now happens in one shared place, used by both the Errors tab and the queue.
* Restored the three missing save helpers behind the queue - approving a task called methods that were not in the file, which was a fatal error.
* The "more N" link inside the insight blocks now marks itself as handled, so the pro script does not toggle it a second time.

= 0.266.66 =
* Checkboxes are square and readable again. The control-height rule was squashing them, so it was impossible to tell an empty box from a ticked one.
* Ticking a level now says so in words ("selected: 189") and a parent shows a half-state when only part of what is under it is picked. Rows loaded after the tick inherit it, so what will be affected is no longer a guess.
* New "Add to the queue" button in the Errors tab, under "How to fix it", for the image findings. One click from "141 images without alt" to a filled queue, with the same count and credit confirmation as elsewhere.

= 0.266.65 =
* Uniqueness tab: "in the queue" was misleading - it also lit up when only the product's images were queued. It now says exactly what is waiting: "queued for text" or "queued for images".
* Images: "No description" now reads "No image description", in the column header and in the filter, so it is not confused with the product description.
* The "Indirect sales" card now links to the screen that lists which pages actually assist.

= 0.266.64 =
* The plugin now tracks where each image is actually used - as a featured image and inside product galleries - and flags the ones that live in several places at once. Text written for one product would be wrong for the blog post using the same picture, so those images get their own problem type ("Shared image") that can be filtered, and a red badge with the number of places.
* The lookup deliberately reads only the two indexed meta sources. Searching post content by file name was tried and dropped: it scans the whole posts table per image and matches "dress" against "dress-2", which produced false positives.
* The usage answer is cached on the image for seven days and forgotten when the file is renamed.
* Accordion: the checkboxes now read as checkboxes with a "select" label next to them, and expanding a level uses a triangle instead of a plus sign.

= 0.266.63 =
* Pending tasks is now an accordion on three levels: kind of work, then the product or page, then the rows themselves. With hundreds of tasks the flat list was unreadable; now nothing loads until you open it.
* A checkbox on every level. Ticking a kind or a product sends a scope to the server instead of hundreds of ids through the browser, and ticking a level also ticks everything opened under it.
* Approving in bulk now happens on the server from the stored suggestions, so it no longer breaks on a row type it did not expect and no longer stops halfway.

= 0.266.62 =
* Making the text unique now runs from the queue, so "Add to be made unique" is a real button: the series root travels with the task and the finished text waits for review in the series screen.
* One product, one preparation is now active: adding a product to be made unique merges its pending image tasks into it, and images are skipped for products already waiting.
* The confirmation for "Add for analysis" warns about credits again - the analysis does go through the AI, not only the local pre-pass.
* The finished unique text is now reviewed inside the Pending tasks tab: the current value and the new one side by side for title, short and long description and the meta pair, editable before saving, plus the list of images that will be renamed. Saving goes through the same apply path the series screen uses.
* Merging image tasks into a uniqueness task no longer deletes suggestions that were already prepared and paid for - only the ones still waiting.

= 0.266.61 =
* Pending tasks: the list no longer opens filtered to "waiting for review", so the tasks waiting to be processed are visible straight away. The five counters became six (a separate "in progress") and each one is now a button that filters the list to it.
* One height for every control inside the plugin screens - buttons, selects and text fields now line up. Buttons grew a little, fields shrank a little, and both met at 32 pixels.

= 0.266.60 =
* All buttons inside the plugin screens now share one shape and height, so a WordPress button and an AI-module button no longer look different side by side.
* Uniqueness tab: a checkbox in front of every product, a state column (analysed / made unique / in the queue), and two buttons - "Add for analysis" and "Add to be made unique".
* Making a product unique requires a finished analysis. Products without one are skipped with a note instead of burning a request.
* Note: absorbing the image tasks into a uniqueness task is deliberately NOT active yet, because the unique text is still finished by hand from the series screen. Nothing is deleted, so no work is lost.
* Identical image files are recognised by content and analysed once; the text is then copied to the twins where their fields are empty. Model shots reused across every colour no longer cost one request each.

= 0.266.59 =
* New "Pending tasks" sub-tab under SEO. One screen for the whole preparation queue: counters, filters by content type, problem type and state, tasks grouped per page or product, and approval right in the row - read the suggestion, correct a word, press "Save".
* The queue now lives in its own database table (SEOH_Queue), so it can hold thousands of rows and filter fast. Adding is free; the AI cost starts only when the processing is run.
* Images listing: a checkbox in front of every row plus "Add the selected to the queue". Before adding, the plugin counts the images behind the ticked rows and asks the hub how many AI requests are left, then asks for confirmation.
* The "Night image preparation" panel moved out of the Images tab into the new tab.
* One shared button style for the whole plugin, so "Save" and "Suggest with AI" are the same height and shape. "Update" is now "Save" where it means saving.

= 0.266.58 =
* Removed the "save automatically" checkbox from the Images tab. The night queue only prepares suggestions; nothing reaches the site without a human approving it.

= 0.266.57 =
* Image renaming now also fixes the addresses in the content. After a rename, the plugin replaces the old file path with the new one inside post content, covering the full-size file and every generated size in a single pass. Serialized meta is left untouched on purpose.
* Image renaming no longer marks the live image as pending deletion. That was a leftover flag which listed every renamed image among the ones marked for deletion. The files left over from the old name are recorded separately and a daily job removes them after 30 days.
* A suggested name containing a dot ("chair 2.0 oak") is no longer cut short; only real image extensions are stripped.
* Images tab: new "Night image preparation" panel at the top — counts of images waiting for review, done, queued and failed, a per-page list with a "Review" button, and a "Run the preparation now" button. It is drawn only when the Pro queue is present.
* New public helper SEOH_Images::is_generic_name(), so the Pro side can decide whether a file name is nondescript enough to be replaced automatically.

= 0.266.56 =
* Images tab: new "Suggest for all" slot next to "Update all filled" — the AI module walks the listed images one by one and fills name, alt text and description.
* Images tab: new "Add to the task queue" button in the listing — sends every problematic image under the current filter to the Pro night queue.
* New helper SEOH_Images::problem_images() returns the problematic images for a filter; image collection extracted into post_image_ids().

= 0.266.55 =
* Declared compatibility with WordPress 7.1 (Tested up to: 7.1).
* Plugin Check: fixed a LIKE query in the URL-parameter scan to pass its wildcards through a placeholder, and restored the data-layer file-level suppression that a stray phpcs:enable had cancelled, so the rankings and change-history queries no longer report direct-query warnings.

= 0.266.54 =
* Code quality for the Plugin Check tool: passed database table names through %i placeholders in the rankings, change history, database stats and audit queries, and used the full sniff names in the remaining direct-query annotations so the newer Plugin Check recognizes them.

= 0.266.53 =
* Completed the English interface translation: added the remaining page and JavaScript strings so nothing stays in Bulgarian when English is selected.
* Mirror screen: the change figure (for example "(+11,664)") now sits on its own line under the main number and is smaller, so it no longer overlaps the channel breakdown on the right.

= 0.266.52 =
* Conversions & Traffic is now available for every site type, not only WooCommerce stores. Service sites and blogs see conversion goals (calls, emails, forms, bookings, newsletter) plus a Traffic sub-tab. The menu was renamed from "Visits and sales" to "Conversions & Traffic" in both the top and side menus.
* Added a change history that records edits to titles, meta descriptions and content, with who made them and when.
* Many fixes and refinements across the audit, content, speed and settings screens.
* Code quality for the Plugin Check tool: aligned the stable tag with the plugin version, added a missing translator comment, and passed database identifiers through %i placeholders in three prepared statements.

= 0.266.3 =
* Documentation refresh: the readme now describes the full feature set (Mirror, over 100 audit checks, speed from real visitors, GEO/AEO with llms.txt, WooCommerce conversions, rankings, crawl, content planning and monthly tasks).

= 0.266.2 =
* Code quality pass for the Plugin Check tool: translator comments for all placeholder strings, input sanitizing and unslashing on admin AJAX handlers, and database identifiers passed through %i placeholders in prepared statements.
* Replaced array_is_list() with an internal helper to stay compatible with the declared WordPress 6.2 minimum.

= 0.213.5 =
* Removed all remaining paid/locked wording from the English translations and the readme.
* The site now registers with our connection service only when the user clicks "Connect Google account" (no automatic call before consent).

= 0.213.2 =
* The Google connection origin check now runs entirely inside the plugin, with no dependency on the hub database.

= 0.213.1 =
* Fixed the admin stylesheet not loading after the slug change.

= 0.213.0 =
* The "Fix" button now writes titles and meta descriptions directly into the active SEO plugin (Yoast, RankMath, SEOPress, All in One SEO) for everyone, with no restrictions.
* Text domain aligned with the plugin slug (digitalm-insideseo).
* Hardened the Google account connection with an origin check on the return step.

= 0.212.0 =
* Renamed to DigitalM Inside SEO.
* Streamlined the plugin for the WordPress.org directory.
* Menu reorganized: Mirror, Conversions, Rankings, SEO, GEO/AEO, Settings, System info, About.

= 0.211.0 =
* Google connection simplified to a single button.
* Full English translation of the interface.
* Compatibility with WordPress 7.0 AI Connectors (with graceful fallback for WordPress 6.2+).

= 0.210.0 =
* Fixed input sanitization and output escaping across admin screens.
* Added translator comments for all strings with placeholders.
