<?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>DEV Community: AI Client Discovery</title>
    <description>The latest articles on DEV Community by AI Client Discovery (@aiclientdiscovery).</description>
    <link>https://dev.to/aiclientdiscovery</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4240073%2F9c877d5b-472c-47b8-bfe7-8e24953f0ed4.png</url>
      <title>DEV Community: AI Client Discovery</title>
      <link>https://dev.to/aiclientdiscovery</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aiclientdiscovery"/>
    <language>en</language>
    <item>
      <title>Got an ADA website demand letter? What to check in the first 72 hours (technical side only)</title>
      <dc:creator>AI Client Discovery</dc:creator>
      <pubDate>Thu, 12 Nov 2026 02:34:52 +0000</pubDate>
      <link>https://dev.to/aiclientdiscovery/got-an-ada-website-demand-letter-what-to-check-in-the-first-72-hours-technical-side-only-deb</link>
      <guid>https://dev.to/aiclientdiscovery/got-an-ada-website-demand-letter-what-to-check-in-the-first-72-hours-technical-side-only-deb</guid>
      <description>&lt;p&gt;If your small business just received a letter claiming your website violates the ADA, this is the technical half of what to do in the first 72 hours. The legal half belongs to a lawyer — get one before the deadline in that letter. What follows is the evidence side, which is the part most owners have nobody for.&lt;/p&gt;

&lt;p&gt;You are not an edge case. Law firm Seyfarth Shaw counted 3,117 federal website-accessibility lawsuits filed in 2025, and for every filed case there are more demand letters that settle quietly. Most defendants are small businesses, and most cases start the same way: somebody ran an automated scan of your site and printed what it found.&lt;/p&gt;

&lt;p&gt;Step 1 — Preserve everything, starting now. Save the letter and note its deadline. Screenshot your key pages with dates (home, contact, booking or checkout, your top service pages). If you fix things later, this dated "before" state is what proves the timeline.&lt;/p&gt;

&lt;p&gt;Step 2 — Run the same kind of scan they ran. Free tools (WAVE, axe) will show you the usual findings in minutes: images with no alt text, form fields with no label, buttons a keyboard user can't reach, text with too little contrast, videos with no captions, a checkout that can't be completed without a mouse. Automated tools only catch part of the problem — but they're the part a plaintiff's scan catches too, so they're where you start.&lt;/p&gt;

&lt;p&gt;Step 3 — Fix the source code, not the surface. An overlay widget is not a fix: in 2025 the FTC ordered the largest overlay vendor to pay $1 million over claims its product made sites compliant, and sites with overlays installed keep getting sued. The fixes that count are in the page itself — labels, alt text, focus order, contrast — done by you or your developer.&lt;/p&gt;

&lt;p&gt;Step 4 — Document the work like evidence. Keep dated before/after scan results and a dated log of what was fixed, where, and when. Whatever happens next — settlement talks, a response through your lawyer — runs on this paper trail.&lt;/p&gt;

&lt;p&gt;Step 5 — Re-scan and keep the records. A dated re-test after fixes closes the loop and is your proof of good faith.&lt;/p&gt;

&lt;p&gt;One boundary worth knowing: there is no official "ADA certificate" for a private website, and nobody can sell you one. Courts and DOJ settlements use WCAG 2.1 AA as the benchmark — that standard, not a stamp, is what an audit should measure against.&lt;/p&gt;

&lt;p&gt;I run AI Client Discovery. We do human-verified WCAG 2.1 AA audits for small businesses: the scan, a plain-language fix list your developer can apply, and the dated evidence pack your lawyer can work from. We don't give legal advice. If you're staring at one of these letters, the technical evidence is the part we can take off your plate — questions welcome in the comments, or at &lt;a href="mailto:aiclientdiscovery@gmail.com"&gt;aiclientdiscovery@gmail.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>Webhook signature verification fails even though the secret is right</title>
      <dc:creator>AI Client Discovery</dc:creator>
      <pubDate>Thu, 12 Nov 2026 01:41:56 +0000</pubDate>
      <link>https://dev.to/aiclientdiscovery/webhook-signature-verification-fails-even-though-the-secret-is-right-1nng</link>
      <guid>https://dev.to/aiclientdiscovery/webhook-signature-verification-fails-even-though-the-secret-is-right-1nng</guid>
      <description>&lt;p&gt;Reproduced in my own test setup — not a client's, and no real account involved:&lt;br&gt;
a Stripe-style webhook keeps failing signature verification even though the&lt;br&gt;
signing secret is definitely right. Posting the reproduction because the cause&lt;br&gt;
turned out to be a one-line pipeline mistake, and the error message gives you&lt;br&gt;
no hint which side is wrong.&lt;/p&gt;

&lt;p&gt;The setup: a test endpoint receives the webhook, parses the JSON body, then&lt;br&gt;
verifies the HMAC signature. Secret copied straight from the dashboard, event&lt;br&gt;
after event, verification fails every time.&lt;/p&gt;

&lt;p&gt;What actually breaks it: the signature is computed over the exact bytes that&lt;br&gt;
arrived, not over "the same JSON". My handler parsed the body and then&lt;br&gt;
re-serialized it before verifying — pretty-printing plus sorted keys. Same&lt;br&gt;
payload, same secret, different bytes, different signature. I confirmed it&lt;br&gt;
with a local check: signature over the raw body verifies; signature over the&lt;br&gt;
re-serialized body does not. Nothing was wrong with the secret at all.&lt;/p&gt;

&lt;p&gt;The fix, in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Capture the raw request body as bytes BEFORE any JSON parsing, and verify
the signature against those bytes only. In most frameworks that means
reading the raw body / disabling the JSON body parser on the webhook route. Only after verification passes, parse the body and process the event. If your platform parses the body for you before your code runs (some
no-code webhook steps do), check whether it offers a "raw body" output —
if it doesn't, verify at a step that still sees the raw payload, or move
verification to a small endpoint that does.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How to tell this apart from a genuinely wrong secret: compute the HMAC&lt;br&gt;
yourself over the raw bytes you actually received (log them once, exactly as&lt;br&gt;
received) and compare with the signature header. If your hand-computed value&lt;br&gt;
matches the header, the secret is right and something downstream is&lt;br&gt;
re-writing the body — that is this bug. If it doesn't match even over the raw&lt;br&gt;
bytes, then the secret (or the timestamp tolerance, if the sender enforces&lt;br&gt;
one) is the problem, and no amount of re-formatting will help.&lt;/p&gt;

&lt;p&gt;One gotcha while testing: don't "verify" by re-sending from a tool that&lt;br&gt;
re-serializes the payload for you — you'll reproduce the failure and conclude&lt;br&gt;
the secret is wrong. Test against the exact bytes the sender sent.&lt;/p&gt;

</description>
      <category>webhooks</category>
      <category>api</category>
      <category>debugging</category>
    </item>
  </channel>
</rss>
