Spam protection that tells you why.

Twelve checks run on your own server and add up to a score. Two thresholds decide: hold it for you, or refuse it. And the log names the check that fired — so when it gets one wrong, you can see it and put it back.

100% localNo accountEvery block explainedOne-click “Not spam”Comments, login & formsOptional Turnstile

Free forever. No account, no card. Sends nothing anywhere unless you switch on Turnstile with your own Cloudflare keys.

12

independent checks, every one of them running on your own site.

🔍
Every block has a reason“Contains 5 links, more than the 2 allowed” — not just “spam”.
↩️
One click puts it backReleases the message and allow-lists the sender, so it cannot happen twice.
🛒
Checkout is never guardedA false positive there costs a sale. We do not take that risk.

Why Lynbro Antispam

No subscription

Akismet needs a paid plan the moment your site is commercial. Every check here runs on your own server, on every submission, forever.

Mistakes are visible

Every anti-spam tool guesses wrong sometimes. The ones that cost you customers are the ones that guess wrong invisibly — so ours shows you the message, the reason and a button to release it.

Nothing leaves your site

No submission is shipped off for a third party to judge. The throwaway-domain list ships inside the plugin and is read from disk.

Everything you need — included, free

No "Pro" tier, no nag screens. The features other plugins paywall are here from day one.

🪤
Hidden field

A field real visitors never see. Only a script fills it in.

🔑
Signed form token

Fetched when the page loads, so it survives a full-page cache — and a bot posting straight to your endpoint arrives without one.

⏱️
Honest time trap

The clock starts when your server issued the token, not when the browser claims it did.

🔗
Links, words and markup

Link stuffing, your own blocked-word list, and script tags in a plain message field.

📬
Throwaway addresses

A bundled list of disposable-mail domains, sub-domains included, checked locally.

🔃
Repeats and floods

The same text arriving over and over — counted from the third, so pressing send twice is never held against anyone — and too many submissions from one address.

🌐
Allow and deny lists

An address, a whole domain, an IP or a CIDR range. An allow-list hit ends the checks at once.

🧩
Works with your forms

Comments, login, registration, lost password, Contact Form 7, WPForms, Forminator, Fluent Forms, Elementor and WooCommerce accounts.

☁️
Turnstile, if you want it

Optional, off by default, on your own Cloudflare keys — and if Cloudflare is down, the submission goes through anyway.

Free here — paid almost everywhere else

The two tools most WordPress sites reach for — and what each of them asks of you in return.

FeatureLynBro Anti-SpamAkismet freeSimple Cloudflare Turnstile
Works with no third-party account at all
Free to use on a commercial site
Submissions are judged on your own server
Local checks beyond a challenge widget
Every block names the check that fired
One click releases a mistake and allow-lists the sender
Thresholds you set yourself (hold vs refuse)
Comments, login and contact forms

Requirements

6.2+WordPresstested up to 7.1
7.4+PHP
GPLv2+License
35Languages

FAQ

Does it need an account or an API key?

No. Every check runs on your own server. Cloudflare Turnstile is the one optional extra, and it uses your own Cloudflare keys.

Will it block real customers?

The defaults are deliberately forgiving. A visitor who types slowly, or whose browser blocks our script, is held rather than refused; someone who presses send twice because nothing confirmed the first attempt is not stopped at all; and signing in, registering or asking for a new password are only ever refused outright, never held. Whatever is held or refused shows up in the log with the reason, and one click puts it back.

Does it work behind a cache or a CDN?

Yes. The page markup carries no timestamp and no per-visitor value — the token is fetched separately when the page loads, so the same cached HTML works for everybody. That is usually the first thing a time trap breaks on.

What if a visitor has JavaScript switched off?

Their submission scores as “no token”, which by default holds it for review rather than refusing it, and never keeps them from signing in or registering. If your whole site’s REST API is unreachable, the overview screen says so in plain words — so you hear it from the plugin, not from a customer who never got an answer.

Why is WooCommerce checkout not protected?

Because a shopper who has filled a cart and reached for their card is not the risk worth taking. A false positive at checkout costs a sale, not a comment. Registration, log in and lost password are guarded.

Does it work with my form plugin?

Contact Form 7, WPForms, Forminator, Fluent Forms and Elementor forms work out of the box. For anything else there are two functions to call — one in the form, one on submit.