== Eyesite Monitor: pełna historia zmian ==

= 8.8.26 =
* Fix: form submissions are also recognised by what the visitor typed (e-mail address or message) travelling in the request, so a server error is still caught for any form plugin and for external form services (HubSpot, MailerLite), while unrelated requests are ignored.

= 8.8.25 =
* Fix: a server error counts as a contact-form failure only when it comes from the request that actually submits the form (the form plugin's own endpoint or the form's action address). Errors of unrelated requests made shortly after a submission (chat widgets, newsletter pop-ups, statistics) no longer raise form alarms.

= 8.8.24 =
* Fix: fewer false "contact form not working" alarms. EyeSite's own requests (scanner, speed test, visit counter) and the EyeSite scanner forms no longer count as contact-form submissions, and a single server error within 2 minutes after a successful submission (double click, momentary hiccup) no longer opens an outage after a quiet day.

= 8.8.23 =
* New: security e-mails offer a one-click order for busy owners. Under the main button of the vulnerable plugins e-mail there is a "Let us update it" link (79 PLN net, within 1 business day); the suspicious files e-mail offers a free quote. The link is signed with the site's API key and opens a confirmation page on the EyeSite service; nothing is ordered without pressing the button there.

= 8.8.22 =
* Fix: a copy of the site (e.g. a staging clone with the same database) can no longer disconnect the real site from monitoring: the disconnect request now carries the site's domain and the EyeSite server ignores requests from a different domain.

= 8.8.21 =
* Fix: the mystery-shopper form test reroutes e-mail and blocks integrations only in the request that submits data (POST); simply loading a page with the test cookie changes nothing.
* Fix: honeypot (trap account) alarms at most once per hour per type, further attempts are only logged; the alarm waits at most 5 s for the EyeSite server.
* Performance: with a persistent object cache (Redis, Memcached) visit statistics are buffered in memory and written to the database at most once a minute or every 50 visits.

= 8.8.20 =
* Fix: honest e-mails when a suspicious file problem disappears. If the files are still there but are now recognised as safe (e.g. Sucuri logs), the e-mail says it was a false alarm and apologises. If the files were removed, it no longer says "good news": it says we do not know who removed them, lists what we checked (core and plugin files, new administrators, logins from new places) and what to do if it was not you.
* Improvement: the real EyeSite logo in all plugin e-mails (served from your own site, nothing loaded from other servers); one header for alerts, vulnerability e-mails and reports; clearer "problem solved" wording.

= 8.8.19 =
* Fix: no false "files changed" alarm for protected data files in uploads (Sucuri logs, Smush logs) that start with a die/exit guard and contain no further PHP code, also for large files.
* Security: a stub file whose line comment is followed by PHP code on the same line is no longer treated as empty.

= 8.8.18 =
* Change: shorter privacy wording in the readme (WordPress.org description limit).

= 8.8.17 =
* Fix: fewer false alarms. The daily form display check treats firewall answers (401, 403, 429, 503, Cloudflare challenge pages) as inconclusive instead of "form broken". An e-mail outage opens only after two failures at least 5 minutes apart, and an administrator testing SMTP settings in the dashboard no longer counts.
* Change: encrypted copies of contact-form submissions are on by default only on sites connected to EyeSite; the Privacy section now describes them and the visit statistics.
* Fix: compatibility with PHP 7.2 (no array_key_first()).

= 8.8.16 =
* New: mystery-shopper cleanup works with any form plugin: during a signed test request the plugin records which third-party tables receive new rows and afterwards deletes only the new rows that carry the test's unique number (plus new posts with that number). Sites without a recognised form plugin offer the contact page (or home page) for the test.

= 8.8.15 =
* Improvement: mystery-shopper form test hardened: runs only on sites that opted in (eyesite_formtest_enabled), accepts results only for tests the site actually handled, a first failed test is a suspicion with an automatic retry (alarm only after a second failure), background self-requests and form-plugin queues stay blocked while SMTP plugin queues are allowed, detection starts on plugins_loaded, cleanup runs only after a real submission. Panel shows a failed-and-retrying or inconclusive test plainly.

= 8.8.14 =
* Improvement: test-entry cleanup also covers MetForm (ElementsKit forms in Elementor); entries are deleted one by one with prepared queries (no warnings in WordPress Plugin Check).

= 8.8.13 =
* New (paid plan preparation): after a signed mystery-shopper form test, the test entry is deleted from the form plugin's database (Flamingo, WPForms, Fluent Forms incl. its integration queue, Gravity Forms, Formidable, Forminator, Ninja Forms, Elementor Pro, SureForms, CFDB7). Only entries carrying the test's unique number are touched.

= 8.8.12 =
* Improvement: the vulnerability check after activating, connecting or updating starts after a random delay of up to 10 minutes, so many sites set up at once do not all query the server in the same second.

= 8.8.11 =
* Improvement: code cleanup after the WordPress Plugin Check (no change in behaviour).

= 8.8.9 =
* Fix: the changed-files alert no longer repeats the same files the next day when a scan on a large site is split into parts. Reported files are remembered for 7 days; a file that changes again still alerts.

= 8.8.8 =
* Improvement: the password-guessing alert rounds large numbers ("over 1,000 attempts") instead of showing the exact threshold.

= 8.8.7 =
* Improvement: the "problem gone" e-mail is sent only for problems the owner was e-mailed about before, says when the problem was first seen and why it disappeared (for changed files: marked as intended, re-checked after a plugin update, or back to the original), and drops the confusing counters.

= 8.8.6 =
* New alert: "someone is trying to guess your password" when bots target the real administrator login (20+ attempts in 24 hours) or make 1000+ attempts; at most once a week, with the real numbers, the channel (XML-RPC or login page) and how many administrator accounts lack two-factor login. No e-mail when every administrator already uses two-factor login.
* Fix: behind a local reverse proxy (for example nginx in front of Apache on a private network) every visitor had the proxy's address; failed logins, new-address alerts and visitor statistics now use the real address.

= 8.8.5 =
* New warning: "bot protection blocks our checks" when Cloudflare (for example Bot Fight Mode) answers automated requests with a challenge; in that case the outside checks of XML-RPC and visible logins are no longer reported as closed by mistake.

= 8.8.4 =
* Fix: Elementor Pro forms saved with spaces in their data ("widgetType": "form") are now found by the daily form check.
* Fix: when the certificate works and visitors are redirected to https, but the WordPress address in Settings still starts with http://, the panel says exactly that instead of "the site does not use HTTPS".

= 8.8.3 =
* Compliance: e-mails no longer load the EyeSite logo image from an external server (text logo in brand colours instead); form detection queries use fixed prepared SQL; Plugin Check findings addressed.

= 8.8.2 =
* Fix: log files in uploads protected with a leading PHP die() line (for example Smush logs) are no longer reported as PHP files in uploads; the same start followed by real PHP code still is.

= 8.8.1 =
* Fix: file integrity check compares WordPress core with the language package that was actually installed (a Polish-language site installed from the English package no longer shows a false "modified wp-includes/version.php").
* Fix: protective stub files in uploads that only answer 403/404 (for example WPForms' cache/index.php) are no longer reported as PHP files in uploads.
* Improvement: cached checksum lists are stored compressed (several MB less in the database on sites with large plugins).

= 8.8.0 =
* New: encrypted copies of contact form submissions (30 days). Every message sent by a contact form is also kept, encrypted (AES-256-GCM, key derived from the site's WordPress salts), on the site's own server, so a lead is not lost when the notification e-mail is silently dropped or lands in spam. Copies never leave the site, only administrators can reveal them (each reveal is logged), they are deleted automatically after 30 days and can be switched off in the settings. Works with any form plugin that sends its notification through wp_mail(). Supports the WordPress personal data export and erase tools.
* New: in the event log, "Kopie zgłoszeń" shows which submissions were made while e-mail or a form was down, so you can contact those people. When a submission's e-mail fails or e-mail is down, the owner gets an alert "someone tried to contact you and the e-mail did not arrive", sent by the EyeSite server (not by the site's broken mail), with only the number and time of the submissions, never their content.

= 8.7.12 =
* New: "Dziennik zdarzeń" (event log) page in the EyeSite menu with the full history, filters (important, forms and e-mail, security) and plain-language entries. Form and e-mail outages are now recorded when they start and when they end, with how long they lasted.

= 8.7.11 =
* Fix: an e-mail test that arrived but had authentication issues (no DKIM signature, sender mismatch, blacklist) no longer raises "e-mails are not delivered"; only a test that did not arrive counts as an e-mail outage. Authentication issues stay in the e-mail score.

= 8.7.10 =
* Change: the welcome e-mail's main button again opens the public status page (works on a phone without logging in to WordPress); right after connecting, status.eyesite.pl shows a branded "we are setting up your status page" screen that refreshes itself instead of an empty page.

= 8.7.9 =
* Improvement: the welcome e-mail's main button opens the EyeSite panel; the public status page is a smaller link that says it will be ready within a few minutes (clicked right after connecting it used to show an empty page).

= 8.7.8 =
* Fix: e-mails have a plain white background and start at the left like a normal message (no coloured frame with an empty band on the right).

= 8.7.7 =
* Fix: the EyeSite logo in the panel header now matches the official icon exactly; clearer first step in the welcome e-mail.

= 8.7.6 =
* Improvement: e-mails from the plugin are aligned to the left like a normal message. The repair button reads "Darmowa wycena naprawy" (free repair quote) and the one-click fix button "Napraw teraz jednym kliknięciem"; the XML-RPC fix description is shorter.

= 8.7.5 =
* Improvement: the panel header shows the EyeSite logo and no version number (it stays in the footer). After connecting, all confirmations (connection, visit recording, extra checks) appear as one bar at the top instead of separate messages, and notices from other plugins no longer land inside the first section. The welcome e-mail shows the site address once (as one link) and says plainly to add kontakt@eyesite.pl to contacts.

= 8.7.4 =
* Improvement: the known-vulnerabilities box says plainly what is at risk ("Someone can break into the site through outdated plugins / theme / WordPress") instead of the technical word "vulnerability"; the alert e-mails use the same wording.

= 8.7.3 =
* Improvement: the security event log is readable for non-technical owners: one sentence on top ("nothing suspicious in the last 30 days" or how many important events), only important events with what to do, and who did it in plain words ("you", "someone with server access", "automatic"). The full log is folded under "show full log", with repeated entries shown once.

= 8.7.2 =
* Change: "Fix now" works with a single click (what will change is shown under the button) and is available once the site is connected to EyeSite monitoring. Without a connection the "To do" list shows no per-item links or buttons, so the only call to action is the one to connect. Undo in the settings always works.

= 8.7.1 =
* Fix: "Fix now" for account logins now also removes the users sitemap, keeps each logged-in customer's own profile in the REST API, redirects only numeric ?author= scans with a temporary redirect, and says "checked" only when the site really answered the check. The XML-RPC fix undoes itself when Jetpack, ManageWP, InfiniteWP or BlogVault is activated later, and mentions the WordPress mobile app. One click now runs a single health check instead of three.
* Fix: day-by-day availability from the EyeSite server older than two days is ignored (never shown as fresh), and it is removed when the site is disconnected or no longer monitored.

= 8.7.0 =
* New: one-click fixes in the "To do" list. "Fix now" closes XML-RPC (xmlrpc.php answers 403, pingback header removed) and hides account logins (REST user list for visitors, ?author= scans, user sitemap). Each fix is checked from outside right away, the health score updates on the spot, and every fix can be undone in the settings. Fixes are made with WordPress filters inside this plugin, no server files are changed, and they are not offered when Jetpack, ManageWP, InfiniteWP or BlogVault need XML-RPC.

= 8.6.3 =
* Fix: monthly report availability now uses the day-by-day results measured by EyeSite every minute (fetched from status.eyesite.pl), not only the points the site's own cron happened to save, so days with data are no longer shown as "no measurement".
* Fix: the availability chart starts on the day monitoring began, uses equal-height bars and only the colours that occur; the percentage is shown in green only with at least 7 days of data.
* Fix: the report separates real problems ("Do naprawienia") from recommendations ("Warto poprawić"), explains each one in plain words, and no longer shows "0 fixed" or an orange mail score for a working mailbox with a single DNS note.
* Fix: fewer false alarms. A mistyped visitor address (rejected recipient) is no longer treated as an e-mail outage, a form error on a single field no longer counts as a failed submission, bot spam on a site that never had a successful submission no longer looks like a broken captcha, and a blog post that quotes a form shortcode is not reported as a broken form.
* Fix: an e-mail test that did not arrive is repeated after 3 hours and becomes an outage only when the second one fails too (the first one may have landed in spam). A test triggered during the pause between tests now runs when the pause ends instead of the next day.
* Fix: the form test lets the e-mail itself through when the site sends mail by API (Gmail, SendGrid, Brevo, Mailgun, Microsoft) and works on sites with and without "www".
* New: form checks that do not wait for visitors: a daily check that every page with a form still shows the form, its submit button and an active form plugin; captcha keys verified at the source every day; a "mystery shopper" test that submits the form like a customer and confirms the e-mail really arrived (the notification goes to the EyeSite test inbox, not to you).
* New: a form outage now lasts until the first successful submission (no more false "working again" after an hour), opens at once when the server fails to send a form's e-mail, and also when different visitors try to submit and none succeeds. Submissions sent with XMLHttpRequest (WPForms, Elementor, Fluent, Gravity), 403/400 responses, SureForms, Kadence, Jetpack, MetForm and Everest Forms are now recognised.
* New: honest status: e-mail and forms show green only after a successful test, with its date; "only observed" and "not checked yet" are shown as such.
* Changed: e-mail delivery test runs weekly and right after anything that could break e-mail (SMTP plugin or settings change, DNS change, first failed e-mail, sudden silence); a test e-mail that does not arrive within about an hour is an outage, not "unknown"; the outage lasts until a successful e-mail or test. Common causes are named with a fix: disabled mail(), rejected SMTP password, Microsoft 365 basic auth, expired Gmail/Outlook connection, DMARC rejection, sending limits, local mail routing when the domain's mail is at Google/Microsoft, and forms that send "from" the visitor's address.
* New: scan of posts, options and Elementor data for injected, obfuscated scripts.
* Security: after an independent review the trap account can no longer be logged into or reset, IP addresses stay on the site (never sent to EyeSite), the Cloudflare visitor header is trusted only from Cloudflare, accepted file changes are remembered with their content, and a plugin update during a file check no longer causes a false alarm.
* New: break-in and data-leak detection. A database leak trap (an invisible account whose login exists only in the database: a login attempt on it means the database was stolen), checksums of WordPress core and plugins from WordPress.org plus new PHP files next to them, change tracking for premium plugins and the active theme, PHP files in uploads, backups and config copies that anyone can download, and new third-party scripts on the home page.
* New: login attempts are sorted into noise and the few that matter (the real admin login, the trap account, addresses that ignore robots.txt), an alert on a successful admin login after a series of failures from a new address, and an optional leaked-password check (Have I Been Pwned, k-anonymity).
* New: a security event log (new administrators, admin e-mail and password changes, plugin installs, site address changes). On connected sites a copy goes to EyeSite at once and the alerts are e-mailed by EyeSite, so they arrive even if an intruder changes the admin e-mail. Deactivating or disconnecting the plugin now tells EyeSite who did it.

* Changed: clearer subject for the "bestseller out of stock" e-mail; counters in the "problem fixed" e-mail are evenly spaced.
* Changed: the "problem fixed" and "bestseller out of stock" e-mails now use the same clear layout as the welcome e-mail (headline, list, counters, one button), with a plain-text version.
* Changed: the e-mail after connecting is now a clear welcome message (what we check, when you get an alert, the live status link and a tip to keep alerts out of spam), with a plain-text version for mail apps that prefer it.
* Docs: the Privacy section now says exactly when the `eyesite_session` cookie is set (also after a successful form submission and when leaving the cart or checkout with products in the cart).
* Changed: the panel answers three questions first - does the site work, am I losing money, what should I do. Under the score there is one plain sentence (for example "The shop is online, but customers cannot buy") and how much the score will rise after fixing the urgent items.
* Changed: the to-do list is split into "urgent" and "worth improving", the same problem is no longer listed twice, and most items have a link that opens the right WordPress or WooCommerce settings. Asking us for a repair is one button per group instead of one per item; the extra upsell banner is gone.
* Changed: clearer names and empty states ("Errors on the site", "Server errors", "not measured yet", "no visits in this period"), sections with a problem open by default, larger and darker description text.
* Fixed: the mail group in "What we watch" no longer shows a green tick while the mail section reports a weak score.

= 8.3.9 =
* Added: advanced monitoring (visit recordings and click maps) can be switched on while connecting: an optional checkbox on the EyeSite connect page, under the button. Ticking it accepts the data-processing agreement; visitors are recorded only after they agree in the cookie banner. Sites connected without it see a bar at the top of the panel, visible while scrolling, that switches it on in one click (the click accepts the agreement).
* Changed: one connect button in the whole panel, in one colour.

= 8.3.1 =
* Fixed: the welcome screen after the first activation stayed on "Checking..." and no button worked, because a block of styles ended up inside its script. Affected new installs since 7.8.1.
* Changed: the welcome checklist shows the payment and checkout steps only on WooCommerce stores.
* Fixed: an empty score or speed result shows "?" instead of a stray colon.

= 8.3.0 =
* Fixed: fewer false alarms about the checkout. The cart monitor reacts only to server errors or a checkout that really does not load, a firewall answer (401, 403, 429) or a store in catalog mode is reported as "could not check" instead of critical, and "customers cannot complete the purchase" appears only after the failure is confirmed. While the checkout is failing it is re-tested every 30 minutes.
* Fixed: form submissions are no longer counted as JavaScript errors, validation messages no longer count as failed submissions, and WP-CLI noise is ignored.
* Fixed: scheduled tasks are re-created automatically if they go missing, and the database is updated automatically after a plugin update.
* Fixed: disconnecting tells the EyeSite service first and then removes the connection; the connection is dropped only when the service explicitly says it was revoked.
* Fixed: "days under care" is counted from the moment the site was connected, also in the warning shown before deactivation.
* Improved: the PHP error handler works together with other error handlers and reports a repeated warning only once per 5 minutes.
* Improved: connection parameters are passed in the URL fragment, so they never reach server logs; error reports from visitors are accepted without a nonce only for logged-out visitors.
* Improved: faster uptime answers for the monitoring service; order anomalies now look only at failed and refunded orders.
* Changed: Polish texts corrected across the panel, e-mails and the monthly report (plural forms, wording), numbers are always written the Polish way, and the bar about the three optional checks says plainly what each of them does.

= 8.2.0 =
* Changed: visitor behaviour analysis is now part of the free plan and no longer stops after 30 days. Recordings are kept for 30 days on a rolling basis and deleted automatically; visit statistics are kept for 13 months.
* Changed: less data is stored - only the country (no city or region), no URL query strings and no ad click identifiers.
* Added: [eyesite_rezygnacja] shortcode that lets visitors switch off recording in their browser, and a suggested paragraph in Settings -> Privacy -> Policy guide.
* Changed: acceptance of the data-processing agreement is recorded by EyeSite, not only in your WordPress.

= 8.1.0 =
* Added: "Jak ludzie zachowują się na stronie" - optional session recording and heat maps for connected sites, with a 30-day free preview. Off by default, switched on from the plugin panel after accepting a data-processing agreement, and it waits for the visitor's consent unless you decide otherwise. Form fields are masked, recordings are deleted after 30 days, and disconnecting the monitoring switches it off.

= 7.8.3 =
* Changed: connecting the monitoring now switches on the three checks that use an external service (page speed, known vulnerabilities, domain expiry), instead of asking about them separately. The connect screen says so, and each one can be switched off in the settings afterwards. Sites that are not connected keep everything off, as before.

= 7.8.2 =
* Fixed: deactivating the plugin now ends the monitoring. Until now the site stayed in the queue and kept sending outage alerts to someone who had already removed the plugin.
* Added: a short warning before deactivation on a connected site - what you lose and since when we have been watching - with one click to go through anyway.
* Changed: the duplicated availability tile is gone. Sites now see days without an outage in a row, shops see orders from the last 30 days with the conversion under it.
* Fixed: the settings section printed its heading twice, and the fold was called "settings and loss calculator" even where no calculator exists.

= 7.8.1 =
* Fixed: the plugin no longer calls every site a shop. A blog owner uninstalled it with "this plugin is not for me, I have a blog, not a shop" - the wording now follows what the site actually is, across the dashboard, the onboarding, the connection e-mail and the monthly report. Genuinely shop-only checks (cart, checkout path, products, right of withdrawal) are unchanged.
* Added: one button that switches on the three checks needing an external service (page speed, known vulnerabilities, domain expiry), offered during onboarding and once more after connecting. They stay off until you say yes.
* Fixed: unchecking any setting had no effect, because an unchecked box sends nothing and the form had no hidden field.
* Changed: the settings no longer name the internal backend host; they say in plain words what leaves the site and why. The full list of services and endpoints stays in this readme.
* Changed: page speed is measured once a day instead of every six hours.
* Added: two conversion figures in the monthly report - visitors who order and visitors who send a form - shown only from 30 visitors up, so a single click cannot read as 20%.

= 7.8.0 =
* Added: simple traffic statistics kept entirely on your own server - views, visitors, top pages, referring domains, form submissions, and carts and orders in shops. No Google, no cookies, no IP addresses, no per-visit rows: only daily totals.
* Added: the monthly report now says whether anyone actually visits the site, and turns an outage into a number of visits that hit a site that was not working.
* Added: a "Ruch na stronie" card in the plugin panel, and a settings toggle (on by default) to switch the whole thing off.
* Changed: measurement is one short beacon sent after the page has loaded, so it works behind full-page caches and does not delay rendering.

= 7.7.0 =
* Changed: the weekly report is gone. One report a month is left; outages, vulnerabilities and broken carts are reported the minute they happen, so the weekly summary only crowded the inbox.
* Added: a day-by-day uptime chart for the last 30 days at the top of the report, built from table cells so it survives Gmail and Outlook.
* Added: a daily refresh of the uptime history, so the chart has no gaps on sites whose dashboard nobody opens.
* Changed: sites that have the plugin but never finished connecting see one line explaining what the chart would show, instead of a fake 100%.
* Removed: the one-click weekly/monthly switch in the report footer, no longer needed.

= 7.6.1 =
* Changed: plainer Polish in the security e-mails and a wider layout, so the list of findings has room to breathe.

= 7.6.0 =
* Added: an e-mail the day a new publicly known vulnerability appears in one of your plugins or themes, instead of waiting for you to open the dashboard.
* Added: an e-mail when WordPress itself is running a version with known security holes, with a link to the update screen.
* Changed: the first check after switching the vulnerability scan on only records the current state, so you never get a wall of old findings; every later finding is reported once.
* Added: a separate setting to turn these security e-mails off while keeping the check itself.

= 7.5.0 =
* Changed: the report is sent when something actually changed on the site, not every Monday; when nothing changes, a short "all good" summary goes out once a month.
* Added: one-click switch to a monthly report from the footer of every report, no login needed.
* Added: one calm note about the paid Alarm plan (instant alerts and SMS) at the end of the report.
* Changed: report icons are now plain coloured markers in the EyeSite palette instead of emoji (inline SVG is stripped by most mail clients).

= 7.4.8 =
* Fixed: fatal error on activation or update when the EyeSite Scanner plugin is active on the same site (shared classes were declared twice).
* Fixed: an insecure WordPress version is detected right after activation and on the first dashboard visit, not only after the first background job.
* Changed: an insecure WordPress version is shown as the first row of the red vulnerability section, with a button to the WordPress update screen, also when the optional plugin vulnerability check is off.

= 7.4.7 =
* Changed: connect button wording and trust line.

= 7.4.6 =
* Changed: the connect call to action talks about tomorrow, not about the scan that just ran, and names a real risk from this site when there is one.
* Changed: until the site is connected, every detail section opens with a one-line reminder that the result is a one-off scan.
* Changed: no more em or en dashes anywhere in the plugin's text.

= 7.4.5 =
* Changed: the "connect" call to action is the primary button; before monitoring is on, the score card shows a quiet link instead of a second button.
* Changed: the feedback box is folded by default.
* Changed: the preview alert cards show this site's own top problems (no more "customers cannot pay" on a site that is not a shop) and animate in one after another.

= 7.4.4 =
* Changed: known vulnerabilities now appear in their own alert section at the top of the dashboard, above the to-do list, with a one-click "Update" button that runs the normal WordPress updater (when an update is available in the plugin's own update source).
* Changed: shorter AI visibility cards.

= 7.4.3 =
* Fixed: a short home page is no longer described as built with JavaScript. That wording now needs real evidence of a JavaScript application; otherwise the plugin only says there is little text.

= 7.4.2 =
* Added: AI visibility checks in the Google group: robots.txt rules for AI search bots (ChatGPT, Claude, Perplexity) versus training bots, whether the server turns an AI search bot away, schema.org data about the business, and whether the content is readable without JavaScript. Reads your own site only.

= 7.4.1 =
* Added: optional check for plugins and themes with publicly known security holes, with the version that fixes them. Off by default; data from Wordfence Intelligence.

= 7.4.0 =
* Added: warning when the installed WordPress version has publicly known security holes (WordPress.org marks it as "insecure"). Checked once a day against the public WordPress.org release list; nothing about your site is sent.

= 7.3.2 =
* Fixed: no more "problem fixed" e-mails about WP-Cron. On low-traffic sites background tasks pause between visits, which is normal and not worth a message.
* Fixed: the "problem fixed" e-mail says "site" instead of "store" when WooCommerce is not active.

= 7.3.1 =
* Docs: new Privacy section describing the visitor data stored locally (front-end errors, abandoned carts), the `eyesite_session` cookie and retention.
* Added: suggested privacy policy text in Settings -> Privacy -> Policy guide.

= 7.3.0 =
* Changed: all features are free. Google visibility checks and the real e-mail delivery test are available to every site (the delivery test requires a connection to EyeSite, as it uses the EyeSite mailbox).
* Removed: PRO licence key, licence verification requests and locked previews.

= 7.2.5 =
* Fixed: "problem fixed" e-mails were repeated every hour when a check flapped. A problem must now stay open for 2 hours, and the same problem is reported as fixed at most once every 7 days.
* Fixed: WP-Cron is reported as not working only when scheduled tasks are overdue by more than an hour (low-traffic sites no longer trigger false warnings).

= 7.2.4 =
* Fixed: mail configuration check now audits the domain e-mails are actually sent from (WooCommerce sender address, SMTP plugin sender, or the site domain) instead of the administrator's e-mail domain. Old results are re-checked automatically.
* Fixed: the PRO preview overlay no longer overlaps neighbouring check groups.

= 7.2.3 =
* Privacy: page-speed measurement is now opt-in and off by default (new setting); no measurement is scheduled on activation.
* Privacy: domain expiry check (RDAP) is now opt-in and off by default (new setting).
* Changed: admin CSS moved to assets/css/eyesite-admin.css (loaded only on EyeSite screens); all inline JavaScript is added with wp_add_inline_script().
* Docs: External services section now covers audit/repair requests, the connection notice, PRO licence check, e-mail delivery test and RDAP.
* Removed: unused warning e-mail helper, redundant core includes, "Tested up to" plugin header.

= 7.2.2 =
* Coding standards: Plugin Check 2.1 annotation for the read-only error_reporting() level check in the PHP error handler.

= 7.2.1 =
* Security: all queries on the plugin's own tables now pass the table name through $wpdb->prepare() with the %i identifier placeholder.
* Security: display-only URL flags are sanitized; every state-changing request remains capability- and nonce-checked.
* Changed: minimum WordPress version raised to 6.2 (required for %i).
* Coding standards: Plugin Check clean-up (same fixes as 6.7.2).

= 7.2.0 =
* Added: three hardening checks in "Bezpieczeństwo", checked from inside (no guessing): XML-RPC open, user logins exposed via the REST API, directory listing in uploads. Each with a plain explanation and a one-click fix request.
* Fixed: a corrupted character in the DMARC explanation.

= 7.1.0 =
* Changed: the visitor session cookie is no longer set by PHP on every page view. It is created in the browser only when there is something to report (a front-end error or an abandoned cart), so full-page caches (LiteSpeed, WP Rocket, Cloudflare APO, Varnish) keep serving cached pages to every visitor.
* Fixed: an uncaught front-end error on a page without a form was recorded twice (once without browser/session context).
* Changed: error tables, wider action column so the "Zleć naprawę" button is never cut off; the resolve button now reads "Oznacz jako naprawione".

= 7.0.0 =
* Added: score history (daily point, sparkline in the hero), a short "problem naprawiony" e-mail when a reported problem stops occurring (toggle in settings), and a "Naprawione w tym tygodniu" block in the weekly report.
* Added: PRO licence key field in settings (verified daily against the EyeSite backend, 14-day offline grace).
* Changed: returns check is one line inside "Reklamy i analityka"; server errors live only on their own page; the real-delivery mail test is a PRO feature.
* New dashboard for shop owners, not engineers: a "Zdrowie sklepu" score (0-100) with three plain sentences (can customers buy, do e-mails arrive, is the domain paid) and proof of work, checks run since install, problems found, problems fixed.
* First-run onboarding: the plugin runs its real checks once, shows the score and the first thing to fix, then offers 24/7 alerts. No tooltip tour.
* "Do zrobienia" is the one action list: every item explains what it means for sales and offers a single "Zleć naprawę, darmowa wycena" button (price shown only via the eyesite_fix_price filter).
* Detailed sections (checks grid, analytics, returns, carts, settings) are folded by default; they open when something needs attention.
* Weekly report opens with the score and the checks/problems counters.

= 6.9.1 =
* Fixed: when the shop was reported as down, the availability hero and KPI card jumped into the connection card (WordPress core relocates every `div.error` under the first heading).
* Changed: the purchase-path section is collapsible (open automatically when something is wrong); Google visibility is a PRO feature and shows as a locked preview on free sites.

= 6.9.0 =
* Added: purchase-path test for WooCommerce, once a day (and on demand) the plugin walks product → add to cart → cart → checkout over HTTP like a visitor and checks that a payment method is offered. No order is placed. Fails show up in "Do naprawienia" and the weekly report.
* Added: domain expiry check (RDAP), warning 30 days before, critical at 7 days or expired.
* Added: Google visibility check, "discourage search engines", noindex on the home/shop page (meta or X-Robots-Tag), robots.txt blocking everything, missing sitemap, canonical pointing at another host.
* Improved: mail deliverability section rewritten in plain language; the probe inbox no longer requires plus-addressing.
* Status endpoint: new aspects `checkout`, `seo`, `domain`.

= 6.8.1 =
* Fixed: disconnecting now confirms the revocation with the EyeSite backend and retries from cron when the call fails, previously a lost request left the site monitored (and alerted on) after "Rozłącz".
* Added: real delivery test for the mail audit, once a day (and on demand, at most hourly) the plugin sends one minimal plain-text probe message to an EyeSite inbox and reads back how the receiver authenticated it: SPF/DKIM/DMARC results, whether the message actually carried a DKIM signature, sending IP and host, Return-Path/From alignment, blacklist hits and delivery time. Only a random token is sent, no site or customer data. Skipped automatically when the site is not connected or the DNS audit already reports a critical SPF/MX problem.

= 6.8.0 =
* Added: mail deliverability audit, daily DNS check of the sending domain (SPF record count and lookup limit, `all` policy, DMARC policy, MX, common DKIM selectors) with a 0-100 score, plain-language fixes, a card in the checks grid and a section in the weekly report. Nothing is sent; only DNS is read.
* Redesigned: calmer admin interface, single brand accent, monochrome SVG icons instead of emoji, flat hairline cards, tabular numerals.
* Fixed: error tables, the sticky header no longer covers the first row.
* Improved: error pages get severity chips, an empty state and an icon in the filter field.

= 6.7.1 =
* Added: weekly HTML report e-mail (Monday 08:00) with uptime, PageSpeed, 7-day errors, abandoned carts, SSL days left and bestseller availability. Can be disabled in settings.
* Added: daily SSL certificate expiry check, warning at 21 days, error at 7 days or expired.
* Added: bestseller stock watch, an out-of-stock top-5 product raises a dashboard warning and a one-time e-mail.
* Added: feedback form on the dashboard (rate-limited, nonce-protected).

= 6.7.0 =
* Added: KPI trend cards on the dashboard (availability, response time, speed, errors) with inline SVG sparklines built from real measurement history.
* Improved: speed and uptime history is stored (bounded) so trends accrue over time; all new data is removed on uninstall.
* Improved: calmer visual style, white cards, neutral borders, solid buttons.

= 6.6.3 =
* Improved: sticky top bar with live status and section quick-navigation, "Status systemu" moved above the checks grid, side-by-side error/cart bands, live filters on error pages, back-to-top button. No logic changes.

= 6.6.2 =
* Fixed: connect/disconnect notices were never displayed on the plugin pages.
* Fixed: downtime cost calculator now supports WooCommerce HPOS order storage (returned 0 on WooCommerce 8.2+).
* Security: cart dashboard widget restricted to shop managers/admins; user ID for JS error reports is taken server-side; session ID and cart values are validated and clamped; global rate limit on cart-abandonment reports; oversized payloads are truncated instead of dropped.
* Compatibility: XHR breadcrumb wrapper preserves the prototype chain and static constants used by third-party scripts.

= 6.6.1 =
* Redesigned admin interface: refreshed design system (typography, depth, color), refined status cards and availability sparkline, gradient action buttons, styled error tables, accessible focus states, and reduced-motion support. No functional changes.

= 6.6 =
* Fixed: HTTPS check now recognises TLS terminated at a proxy/CDN (X-Forwarded-Proto, Cloudflare), no more false "no HTTPS" alarms behind load balancers.
* Fixed: task-queue check counts only overdue actions, shops with subscriptions/automations (which always hold future-scheduled actions) no longer trigger false "queue overloaded" alerts.
* Fixed: "series of failed payments" counts only genuinely failed orders, batch auto-cancellations of unpaid orders no longer trigger it.
* Fixed: Contact Form 7 submission results are now detected via CF7's DOM events (the legacy CSS classes were removed in CF7 5.2), so successes are counted on modern installs.
* Fixed: the returns/withdrawal page scan reads all pages separately from blog posts, an active blog can no longer hide the returns page from detection.
* Improved: a single failed e-mail is a warning; the error-level alert requires repeated failures within 15 minutes.
* Improved: order-anomaly "critical" requires a minimum volume (3+ orders), so low-traffic shops aren't paged over a single refund.
* Improved: browser-extension errors and opaque cross-origin "Script error." events are filtered out of user error tracking.
* Improved: the status endpoint runs after WooCommerce initialises its cart, avoiding payment-gateway edge cases.

= 6.5.1 =
* Fixed: status endpoint could return a fatal error (HTTP 500) instead of a status when the API token option was missing; an empty stored token is now always rejected.
* Fixed: PHP error occurrence counts were inflated by repeated log scans, each log line is now ingested only once.
* Fixed: false "jQuery not loaded" reports on non-WooCommerce themes that ship without jQuery.
* Fixed: WooCommerce failed-payment window was widened by the site's UTC offset (timezone-safe date query).
* Fixed: leftover scheduled events and transients are now cleaned up on deactivation/uninstall.
* Fixed: PHP warning (and self-recorded error) when error_log points to a character device such as /dev/stderr (common in containers).
* Improved: uptime data is now fetched in the background (like the speed check), a slow status-page response can no longer delay the dashboard.
* Improved: Cloudflare loopback detection is cached for an hour instead of running on every status poll.
* Improved: the visitor session cookie is now set before output starts, so error reports correlate across pages.
* Hardened admin consent card against stale cached data from older versions.

= 6.5 =
* Added Consent Mode v2 and Meta Conversion API checks.
* Added detection of right-of-withdrawal (returns) signals.
* Added connection to the EyeSite service (connect / verify / disconnect handshake) and the required "External services" section.
* Connect form is served from eyesite.pl/connect; verify/disconnect run on the EyeSite automation backend (filterable via eyesite_connect_url / eyesite_verify_url / eyesite_disconnect_url).
* Status endpoint accepts an optional &aspect= parameter (cart, payments, forms, ssl, cron…) returning 200/503 for a single check, so each aspect can be monitored separately.
* Fixed a PHP "headers already sent" warning when generating the session id.

= 6.4 =
* Added intelligent order anomaly tracking.
* Refactored result tiles and dynamic titles.

= 6.3 =
* Added logging of form submission problems.

= 6.2 =
* Improved error tracking and Lighthouse metrics.

= 6.0 =
* First public release of the advanced Eyesite agent.
