<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Noah Kellner</title>
    <description>The latest articles on Forem by Noah Kellner (@but_noah).</description>
    <link>https://forem.com/but_noah</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3855351%2Fe2891e17-e54b-48f6-9c7f-9b4f74f2f803.png</url>
      <title>Forem: Noah Kellner</title>
      <link>https://forem.com/but_noah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/but_noah"/>
    <language>en</language>
    <item>
      <title>reCAPTCHA and GDPR: Why Google’s Bot Protection Is a Legal Risk in the EU</title>
      <dc:creator>Noah Kellner</dc:creator>
      <pubDate>Thu, 02 Apr 2026 22:21:42 +0000</pubDate>
      <link>https://forem.com/but_noah/recaptcha-and-gdpr-why-googles-bot-protection-is-a-legal-risk-in-the-eu-3221</link>
      <guid>https://forem.com/but_noah/recaptcha-and-gdpr-why-googles-bot-protection-is-a-legal-risk-in-the-eu-3221</guid>
      <description>&lt;p&gt;reCAPTCHA sets cookies, transfers data to the US, and tracks users for ad targeting. Here’s why EU businesses are dropping it — and what to use instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Cost of “Free” Bot Protection
&lt;/h2&gt;

&lt;p&gt;reCAPTCHA is free. That’s the pitch. But for EU businesses, the real cost is buried in compliance risk.&lt;/p&gt;

&lt;p&gt;Google’s reCAPTCHA sets multiple cookies (&lt;code&gt;NID&lt;/code&gt;, &lt;code&gt;_GRECAPTCHA&lt;/code&gt;), sends user data to US servers, and — per Google’s own Terms of Service — uses reCAPTCHA interactions to improve Google’s ad targeting products.&lt;/p&gt;

&lt;p&gt;For any site that needs GDPR compliance, that’s three problems in one script tag.&lt;/p&gt;

&lt;h2&gt;
  
  
  What reCAPTCHA Actually Does
&lt;/h2&gt;

&lt;p&gt;When a user loads a page with reCAPTCHA, the following happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cookies are set&lt;/strong&gt; — &lt;code&gt;NID&lt;/code&gt; and &lt;code&gt;_GRECAPTCHA&lt;/code&gt; are placed in the user’s browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data is transferred to the US&lt;/strong&gt; — Mouse movements, browser fingerprints, IP addresses go to Google servers in the United States&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google processes the data&lt;/strong&gt; — Per their privacy policy, reCAPTCHA data feeds into Google’s risk analysis systems&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This means every site using reCAPTCHA needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A cookie consent banner (because reCAPTCHA cookies aren’t “strictly necessary”)&lt;/li&gt;
&lt;li&gt;A Data Processing Agreement with Google&lt;/li&gt;
&lt;li&gt;A legitimate legal basis for the US data transfer&lt;/li&gt;
&lt;li&gt;Disclosure in the privacy policy&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Legal Reality in 2025/2026
&lt;/h2&gt;

&lt;p&gt;Several EU Data Protection Authorities have already flagged reCAPTCHA:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;French CNIL&lt;/strong&gt; has ruled that reCAPTCHA requires explicit consent because it sets non-essential cookies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Austrian and German DPAs&lt;/strong&gt; have questioned whether US data transfers meet GDPR standards post-Schrems II&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;European Accessibility Act (EAA)&lt;/strong&gt;, effective June 2025, adds another layer: visual CAPTCHA puzzles fail WCAG 2.2 AA standards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trend is clear: using reCAPTCHA in the EU is becoming harder to justify legally.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes a GDPR-Compliant Alternative?
&lt;/h2&gt;

&lt;p&gt;A bot protection solution that actually works for EU businesses needs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Set zero cookies&lt;/strong&gt; — No consent banner needed for the bot protection itself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep data in the EU&lt;/strong&gt; — No transatlantic transfers, no Schrems II risk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work invisibly&lt;/strong&gt; — No visual puzzles that fail accessibility standards&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not track users&lt;/strong&gt; — Bot protection shouldn’t be a data collection mechanism&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Proof-of-Work: The Cookie-Free Approach
&lt;/h2&gt;

&lt;p&gt;Proof-of-Work bot protection flips the model. Instead of tracking users to determine if they’re human, it forces the client to solve a small cryptographic puzzle (SHA-256).&lt;/p&gt;

&lt;p&gt;The computation takes ~200ms on a modern device — humans don’t notice it. But bots trying to submit thousands of forms need to solve thousands of puzzles, making spam economically unfeasible.&lt;/p&gt;

&lt;p&gt;No cookies. No tracking. No US data transfer. No consent banner needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the Switch
&lt;/h2&gt;

&lt;p&gt;Replacing reCAPTCHA doesn’t have to be complex. With &lt;a href="https://nforms.eu" rel="noopener noreferrer"&gt;nForms Shield&lt;/a&gt;, the migration is a single script tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Before: reCAPTCHA --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://www.google.com/recaptcha/api.js"&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"g-recaptcha"&lt;/span&gt; &lt;span class="na"&gt;data-sitekey=&lt;/span&gt;&lt;span class="s"&gt;"YOUR_KEY"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- After: nForms Shield --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://api.nforms.eu/shield.js"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API key verification on the backend. No cookie consent changes. No privacy policy updates for a new US data processor.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;reCAPTCHA was designed for a pre-GDPR world where tracking users across the web was the default. In 2026, EU businesses need bot protection that respects the legal framework they operate in.&lt;/p&gt;

&lt;p&gt;The question isn’t whether reCAPTCHA works against bots. It does. The question is whether the compliance overhead is worth it when alternatives exist that don’t set cookies, don’t transfer data to the US, and don’t require visual puzzles.&lt;/p&gt;

&lt;p&gt;For most EU businesses, the answer is increasingly: no.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I’m building &lt;a href="https://nforms.eu" rel="noopener noreferrer"&gt;nForms&lt;/a&gt; — a form backend with Proof-of-Work bot protection and WCAG 2.2 AA validation. EU-only infrastructure, zero cookies. If you’re dealing with reCAPTCHA compliance headaches, I’d love your feedback.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gdpr</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>security</category>
    </item>
    <item>
      <title>Why Proof-of-Work Beats CAPTCHA for Form Protection</title>
      <dc:creator>Noah Kellner</dc:creator>
      <pubDate>Wed, 01 Apr 2026 10:42:40 +0000</pubDate>
      <link>https://forem.com/but_noah/why-proof-of-work-beats-captcha-for-form-protection-49g4</link>
      <guid>https://forem.com/but_noah/why-proof-of-work-beats-captcha-for-form-protection-49g4</guid>
      <description>&lt;p&gt;Every developer knows the drill. You add a form to your site, bots find it within hours, and suddenly you're dealing with spam submissions. The traditional answer? CAPTCHA.&lt;/p&gt;

&lt;p&gt;But CAPTCHAs come with serious trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conversion killer:&lt;/strong&gt; Studies show CAPTCHAs reduce form completions by 12–40%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility nightmare:&lt;/strong&gt; Visual puzzles are fundamentally inaccessible to screen reader users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy concerns:&lt;/strong&gt; reCAPTCHA sets cookies and sends data to Google's US servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User frustration:&lt;/strong&gt; Nobody enjoys clicking traffic lights&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Proof-of-Work Changes the Game
&lt;/h2&gt;

&lt;p&gt;Proof-of-Work (PoW) flips the model. Instead of asking humans to prove they're human, it asks browsers to solve a small math problem — a SHA-256 hash challenge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For humans:&lt;/strong&gt; Completely invisible. The challenge solves in ~200ms in a background WebWorker. Users never see or interact with anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For bots:&lt;/strong&gt; Computationally expensive at scale. A bot trying to submit 10,000 forms needs 10,000 unique PoW solutions. The economics don't work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Implementation
&lt;/h2&gt;

&lt;p&gt;Here's how PoW works for form protection (using the &lt;a href="https://altcha.org" rel="noopener noreferrer"&gt;ALTCHA wire format&lt;/a&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Browser requests a challenge from the server&lt;/li&gt;
&lt;li&gt;Challenge includes a SHA-256 hash target and a maximum number to search&lt;/li&gt;
&lt;li&gt;WebWorker iterates through numbers, hashing each with the challenge salt&lt;/li&gt;
&lt;li&gt;When a matching hash is found, the solution is attached to the form submission&lt;/li&gt;
&lt;li&gt;Server verifies the solution with a single-use nonce (no replay attacks)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The entire process happens in the background. No UI, no interaction, no cookies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Composite Scoring: Beyond Just PoW
&lt;/h2&gt;

&lt;p&gt;PoW alone isn't enough. A serious implementation should combine multiple signals into a composite score:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PoW verification:&lt;/strong&gt; Did the browser solve a valid challenge?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timing analysis:&lt;/strong&gt; Was the form submitted suspiciously fast?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honeypot detection:&lt;/strong&gt; Did a bot fill a hidden field?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI spam scoring:&lt;/strong&gt; Does the content look like spam?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each signal contributes to a final pass/soft-block/reject decision. No single signal is a deal-breaker — and no single bypass breaks the whole system.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About No-JavaScript Users?
&lt;/h2&gt;

&lt;p&gt;Progressive enhancement matters. If a user has JavaScript disabled:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The form still submits normally&lt;/li&gt;
&lt;li&gt;The server flags it as "no-shield" (suspicious but not blocked)&lt;/li&gt;
&lt;li&gt;Server-side heuristics (timing, honeypot, AI) still apply&lt;/li&gt;
&lt;li&gt;Increased rate limiting provides additional protection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No user is locked out. The protection degrades gracefully.&lt;/p&gt;

&lt;h2&gt;
  
  
  The GDPR Angle
&lt;/h2&gt;

&lt;p&gt;Unlike reCAPTCHA (which sets &lt;code&gt;NID&lt;/code&gt; and &lt;code&gt;_GRECAPTCHA&lt;/code&gt; cookies and sends data to the US), a PoW-based approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sets zero cookies&lt;/li&gt;
&lt;li&gt;Performs no browser fingerprinting&lt;/li&gt;
&lt;li&gt;Stores no personal data&lt;/li&gt;
&lt;li&gt;Can run entirely on EU infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No cookie consent banner needed. No GDPR risk assessment required. The architecture itself is the compliance strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;I built this approach into &lt;a href="https://nforms.eu" rel="noopener noreferrer"&gt;nForms&lt;/a&gt; — a form backend that combines PoW bot protection with WCAG 2.2 AA form validation in a single script tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://api.nforms.eu/shield.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;data-nforms-key=&lt;/span&gt;&lt;span class="s"&gt;"YOUR_KEY"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;data-validate=&lt;/span&gt;&lt;span class="s"&gt;"required|email"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Send&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Free plan includes Shield Basic (honeypot + timing). The &lt;a href="https://nforms.eu/pricing" rel="noopener noreferrer"&gt;Developer plan&lt;/a&gt; (€9/mo for early users) adds full PoW protection.&lt;/p&gt;

&lt;p&gt;The contact form on &lt;a href="https://nforms.eu" rel="noopener noreferrer"&gt;nforms.eu&lt;/a&gt; is a live demo — Shield is active on it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The bottom line:&lt;/strong&gt; CAPTCHAs were a necessary evil. Proof-of-Work makes them unnecessary. Your forms get protected, your users get a better experience, and your compliance team gets peace of mind.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The future of form protection is invisible.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>a11y</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
