Frenemy

Description

AI agents, search crawlers, SEO tools, scrapers, and impostors pretending to be all of the above now make up a large share of most sites’ traffic — and standard analytics are built to ignore them. Frenemy watches that traffic instead.

For every request that reaches WordPress, the plugin:

  • classifies the visitor against a maintained registry of known agents (GPTBot, ClaudeBot, Googlebot, PerplexityBot, and many more),
  • verifies identity claims where the operator publishes IP ranges — an out-of-range „Googlebot” is reported as an impostor, a real one as verified. Most bot lists take the user-agent’s word for it; Frenemy checks,
  • separates bots from people, so your dashboard carries a human-only analytics baseline next to the bot ledger — no more crawler traffic inflating your visitor numbers,
  • reports it all to your Frenemy dashboard at frenemy.dev: who visits, how often, what they claim to be, and what each bot costs or earns you.

See first. Then decide — on receipts, not guesses. Your dashboard is where the deciding happens: author per-bot rules and Frenemy shows exactly what each rule would have caught in your real traffic, rehearsing it for as long as you like before anything is ever switched on. Built-in guardrails mean a rule can never touch verified search crawlers your SEO depends on.

The plugin itself is observe-only, by design. It never blocks, slows, challenges, or alters a request — there is no blocking code in it at all. It is also fail-open at every joint: classification runs after your page has already been sent, and any Frenemy failure means „no data,” never a broken or slower site.

Honest about what it sees. Frenemy observes every request that reaches WordPress itself. Cached pages and static files are served before WordPress runs and are not observed — that trade-off is stated in the plugin, on your dashboard, and here, rather than papered over. The requests page caches never serve (cache misses, searches, POSTs, login, REST, and XML-RPC traffic) are exactly where bot and impostor signal concentrates.

Account required. The plugin needs a site key from a Frenemy account (free trial — no card required to start). All plugin code is fully functional and GPL; the key connects it to your dashboard, which is where the analytics, the per-bot ledger, and the rules live. There are no charts inside wp-admin and no duplicate analytics UI — one settings screen, one key, one link to your dashboard.

External services

This plugin talks to exactly two endpoints, both operated by Frenemy (frenemy.dev). It sends nothing anywhere until you save a site key.

1. Registry download (GET). The plugin periodically downloads Frenemy’s public bot registry (user-agent patterns and published IP ranges for known agents) so classification can run locally on your server with no per-request network calls. No visitor data, cookies, or credentials are sent with this request.

2. Event reporting (POST). After a response has been sent, the plugin reports one small event to Frenemy’s ingest service, authenticated by your site key. It contains: the classification result, the request method and path (query strings stripped except utm_*/ref/source), the response status code and duration, the visitor’s IP address (transmitted securely, processed transiently — hashed with a per-site rotating salt and never stored in raw form), and, only for unrecognized bot-like requests, the user-agent string. Human visitors’ user-agents are never transmitted, and presumed-human traffic is sampled, not tracked.

By installing the plugin and entering your site key you consent to this reporting. Details: Terms of Service · Privacy Policy.

Installation

  1. Install and activate the plugin from the WordPress.org directory.
  2. Create a site at app.frenemy.dev (free trial) — the setup wizard shows your site key once.
  3. In WordPress, go to Settings Frenemy, paste the key, and save.
  4. Answer the one topology question on the same screen („How does traffic reach this server?”) — it controls whether Frenemy can verify crawler IPs. Not sure? The default is safe.
  5. Open https://your-site.com/?frenemy=check in a private window; your Frenemy wizard flips to Connected within a minute.

FAQ

Does this slow my site down?

No. Classification and reporting run on PHP’s shutdown hook, after your page has been sent (and on most hosts, after the connection to the visitor is already closed). The classify step itself is local — no network calls in the request path, ever.

Can it block bad bots?

The plugin is deliberately observe-only — there is no blocking code in it at all, which is also why it can never break or slow your site. Deciding is what your Frenemy dashboard is for: you see exactly who visits, verified against operator-published IP ranges, and you can author per-bot rules that rehearse against your real traffic — each one showing precisely what it would have caught. Acting on a bot then becomes a decision you make on receipts, with guardrails that keep rules away from the search crawlers your SEO depends on.

Why don’t I see all my traffic?

Page caches and static files are served before WordPress (and therefore Frenemy) runs. Frenemy sees every request that reaches WordPress itself: cache misses, searches, POSTs, logins, REST and XML-RPC traffic — which is where bot activity concentrates. We state this honestly rather than estimate numbers we can’t measure.

What data do you collect about my visitors?

Per PHP-reaching request: the classification, method and path, status, duration, and the visitor IP (processed transiently on our side — hashed with a rotating salt, raw value never stored). The user-agent string is transmitted only for unrecognized bot-like requests, never for humans. Presumed-human traffic is sampled at a low rate; exact totals are kept via counters, not tracking. No cookies are set, no fingerprinting is done, and no visitor profile is built. See https://frenemy.dev/privacy.

How do I turn it off?

Three ways, strongest first: define FRENEMY_DISABLED as true in wp-config.php (host-level), deactivate the plugin, or use the „Pause observation” toggle in Settings Frenemy. Uninstalling removes every option the plugin created.

Does it work with multisite?

Not yet — single-site installs only in this version.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“Frenemy” is open source software. The following people have contributed to this plugin.

Contributors

Translate “Frenemy” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

0.2.0

  • Classification engine update, matching Frenemy’s Cloudflare and Next.js installs.
  • Reports the plugin version to your dashboard, so out-of-date installs are visible for update.
  • Still observe-only and fail-open: the plugin never blocks or slows a request.

0.1.0

  • First release: local classification against the Frenemy registry (verification, impostor detection, per-family trust gating), observe-only event reporting, topology-aware IP trust, fail-open artifact caching, uninstall cleanup.