=== GEO Copilot Suite ===
Contributors: jakobsommer
Tags: ai, llms.txt, crawler, analytics, gdpr
Requires at least: 6.4
Tested up to: 7.0
Requires PHP: 8.1
Stable tag: 1.4.7
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

See which AI crawlers read your site, which AI answers send you visitors, and control both. All data stays in your own database.

== Description ==

GEO Copilot Suite measures how visible your site is to AI systems, and it does that without sending a single byte about your visitors to anyone.

**What it does**

* **Verified AI crawler analytics.** Records which AI crawlers request which pages, and checks each hit against the IP ranges the operators publish themselves (OpenAI, Google, Perplexity, Apple, DuckDuckGo). A faked GPTBot user agent is shown as spoofed instead of being counted as real traffic.
* **Charts you can actually read.** Total crawler traffic over time from seven days to five years, with per-day values on hover and on the arrow keys, the five busiest crawlers switchable into the same chart, and one collapsible chart plus a short portrait for every single crawler.
* **Visitors from AI answers.** A cookieless first-party script counts arrivals from ChatGPT, Perplexity, Gemini, Claude, Copilot and 15 more sources. No cookies, no local storage, no IP address, no fingerprint, and it keeps working when a full page cache is active.
* **llms.txt generator.** Automatic from your content or curated by hand, optionally with a full text version, with a warning when another plugin already publishes an llms.txt.
* **robots.txt manager.** Allow or block crawlers per bot or per purpose, with presets such as "block AI training, allow AI search", and a warning when a physical robots.txt shadows the WordPress one.
* **Weekly digest and alerts.** Key numbers by email in the language of each recipient, plus alerts for new crawlers and for crawl spikes.

**Honest about cache blindness**

Every crawler tracker that hooks into PHP is blind to hits on cached pages, because a full page cache answers without running PHP. Most plugins do not mention this. GEO Copilot Suite detects WP Rocket, LiteSpeed, W3 Total Cache, WP Super Cache, Cloudflare and others, and tells you that the numbers are a lower bound.

**Privacy**

* No telemetry. The plugin makes exactly one outgoing request: the weekly signature update, which fetches a signed list of crawlers and IP ranges. It is on by default, can be switched off in the settings, and it sends no data about your site.
* Crawler IP addresses are used for verification only and stored shortened (IPv4 to /24, IPv6 to /48). Full addresses never reach the database.
* The referral beacon stores no IP address at all. Its rate limiting uses a hash with a salt that rotates every day.
* Ready-made privacy policy text in English and German, plus integration with the WordPress personal data exporter and eraser.

**Languages**

English and German (informal), complete from day one. Every string is translatable, so a third language needs nothing but a .po file.

== Installation ==

1. Upload the plugin and activate it.
2. Run the two minute setup wizard.
3. Come back in a few days. Crawler data needs traffic.

== Frequently Asked Questions ==

= Do I need a consent banner for the referral tracking? =

The beacon sets no cookie, writes nothing to browser storage, stores no IP address and creates no profile. It counts the name of the referring AI service and the landing page. This is anonymous statistics, not personal data. Your own legal assessment still applies; the plugin ships suggested privacy policy text you can adapt.

= Why does the plugin report fewer crawler hits than my server log? =

Because a full page cache answers most requests without running PHP. The plugin tells you when it detects one. Server log import is planned for the Pro version.

= Does blocking AI training crawlers remove me from ChatGPT answers? =

No. Training crawlers and the crawlers that build the index for AI answers are different bots. The robots.txt screen separates them by purpose so you can block one without the other.

= What happens to my data when I uninstall? =

Everything is removed: tables, options and scheduled events. There is a setting to keep the data instead.

== Screenshots ==

1. Dashboard: key numbers, crawler traffic over time with the five busiest crawlers as switchable series, top crawlers and top AI referral sources.
2. AI crawlers: one collapsible chart and a short portrait for every crawler.
3. Content: which of your pages AI crawlers actually read, with verified and spoofed hits and CSV export.
4. AI referrals: visits from AI answers over time, by source and by landing page.
5. llms.txt generator: automatic or curated, with a live preview of the current output.
6. robots.txt manager: presets plus a rule per crawler.
7. Settings: weekly digest, alerts with a spike threshold and a minimum, signed signature updates.

== Changelog ==

= 1.4.7 = 2026-08-16
* Fixed: tooltip numbers ignored the site language and always used a comma as the thousands separator.
* Fixed: on a site without any hits the chart drew a scale up to 4 instead of up to 1.
* Fixed: the crawler list counted robots.txt-only entries in the "known signatures" number.
* Tested against WordPress 7.0.

= 1.4.6 = 2026-08-13
* Fixed: a failed signature update wrote an empty list into the database instead of keeping the bundled one.
* Fixed: the weekly digest linked to the dashboard with the wrong period when the default had been changed.
* Fixed: the CSV export ignored the crawler filter when a purpose filter was set at the same time.

= 1.4.5 = 2026-08-11
* Fixed: the minimum hit count for alerts was only applied to spikes, not to collapses.
* Fixed: reverse DNS results were cached under a key that ignored the crawler, so a second crawler from the same host inherited the first verdict.
* Fixed: the setup wizard lost the recipient address when the form was submitted with an empty email field.

= 1.4.4 = 2026-08-07
* Fixed: the "new crawler" alert fired for entries that only exist as a robots.txt token and have no user agent at all.
* Fixed: keyboard navigation in charts jumped back to the first point after the last one instead of stopping.
* Fixed: the content view showed the raw path instead of a link when the path contained an encoded character.

= 1.4.3 = 2026-08-04
* Fixed: strings with a context from _x() stayed untranslated because the build script dropped the msgctxt when writing the PHP catalogue. Affected the date format on the chart axis.
* Fixed: the axis format ignored the site language and always used the English order.
* Fixed: the spike threshold accepted values below 10 through the browser and then never fired.

= 1.4.2 = 2026-07-31
* Fixed: for periods longer than a year the remaining days landed in the newest week bucket instead of the oldest, which made the last point look like a collapse.
* Fixed: axis labels overlapped in narrow windows; the chart now drops labels instead of stacking them.
* Fixed: the data table below a chart repeated the header of the previous chart on screens with several charts.

= 1.4.1 = 2026-07-28
* Fixed: charts inside a collapsed section stayed empty until the window was resized.
* Fixed: the selected crawlers were lost when the period changed.
* Fixed: the tooltip ran outside the chart for values at the right edge.
* Fixed: the accordion marker did not rotate in Safari.

= 1.4.0 = 2026-07-23
* Charts rebuilt: values per day on hover and on the arrow keys, a grid with axis labels, and a screen reader announcement for every point.
* The five busiest crawlers can be switched into the same curve. Series stay apart by dash pattern as well as by colour, and the selection survives a change of period.
* Reporting periods from 7 days to 5 years (7, 14, 30, 90, 180 days, 1, 2, 3, 5 years), defaulting to 30 days instead of 7. Periods longer than a year are grouped into weeks.
* The AI crawlers screen opens with the same chart as the dashboard and gives every crawler its own collapsible chart plus a short portrait. All 42 known crawlers are described.
* Alerts take a minimum number of hits per compared period (default 5) next to the percentage threshold.
* Weekly signature updates are on by default. The settings screen calls the endpoint "the update server" instead of naming a host.
* The settings screen ends with a note that data protection rules differ from country to country.

= 1.3.2 = 2026-07-02
* Fixed: the weekly digest went out in the language of the first recipient for everyone.
* Fixed: numbers in the digest differed from the dashboard because the running day was counted twice.
* Fixed: the aggregation pointer was not reset after a table repair, which skipped a day of raw hits.

= 1.3.1 = 2026-06-19
* Fixed: per crawler rules were not written when the preset was set to "no changes".
* Fixed: signature updates were discarded when the server delivered them gzip compressed.
* Fixed: the robots.txt preview showed rules for crawlers that only exist as a user agent, not as a robots.txt token.

= 1.3.0 = 2026-06-11
* robots.txt manager with four presets and one rule per crawler; exceptions win over the preset.
* Crawlers grouped by purpose: model training, AI search, user-triggered fetch, AI agent.
* Warning when a physical robots.txt in the web root shadows the generated one.

= 1.2.2 = 2026-05-20
* Fixed: aggregation ran into the time limit above roughly 200,000 raw rows; it now reschedules itself and continues.
* Fixed: duplicate daily totals after an aborted cron run.
* Fixed: the pruner deleted raw hits of the current day when the retention was set to 30 days.

= 1.2.1 = 2026-05-08
* Fixed: llms.txt was rebuilt on every save instead of only after content changes.
* Fixed: curated entries lost their order after saving.
* Fixed: the llms.txt conflict check missed a physical file when the site ran in a subdirectory.

= 1.2.0 = 2026-04-28
* llms.txt generator: automatic from your content or curated by hand, optionally with a full text version.
* Warning when another plugin or a physical file already serves an llms.txt.
* Language sections for Polylang and WPML.

= 1.1.1 = 2026-04-02
* Fixed: the CSV export lost umlauts in Excel on Windows; it now carries a UTF-8 BOM.
* Fixed: paginating the content view dropped the active filter.
* Fixed: the crawler detail screen showed hits of all crawlers when the slug contained a hyphen.

= 1.1.0 = 2026-03-24
* Content view: which of your pages are read, filtered by crawler and by purpose.
* CSV export of the content view.
* Crawler detail screen with the last 50 hits, verification status and IP prefix.

= 1.0.2 = 2026-03-05
* Fixed: the cache detection reported WP Rocket when only its leftover folder was present.
* Fixed: reverse DNS verification ran before the response was flushed on servers without fastcgi_finish_request.
* Fixed: uninstalling left two scheduled events behind.

= 1.0.1 = 2026-02-20
* Fixed: activation failed on MariaDB 10.4 because dbDelta did not create the unique index.
* Fixed: daily totals followed UTC instead of the site timezone.
* Fixed: the referral beacon reported an empty source when the referrer carried a fragment.

= 1.0.0 = 2026-02-09
* Verified AI crawler tracking with IP verification against the ranges published by OpenAI, Google and Perplexity.
* Cookieless counting of visitors arriving from AI answers.
* Weekly digest by email and alerts for new crawlers and crawl spikes.
* Setup wizard, English and German.

== Upgrade Notice ==

= 1.4.7 =
Fixes for the chart tooltips and the crawler count. Recommended for everyone on 1.4.x.

= 1.4.0 =
Rebuilt charts, reporting periods up to five years and a portrait for every crawler. Signature updates are now on by default; switch them off in the settings if you would rather not have the one outgoing request.
