<?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: asafamos</title>
    <description>The latest articles on Forem by asafamos (@asafamos).</description>
    <link>https://forem.com/asafamos</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%2F3885874%2F471a9b85-cd2c-4f4f-a18a-5fdadb41a486.png</url>
      <title>Forem: asafamos</title>
      <link>https://forem.com/asafamos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/asafamos"/>
    <language>en</language>
    <item>
      <title>Why accessibility overlay widgets don't actually work (and the FTC just fined one $1M)</title>
      <dc:creator>asafamos</dc:creator>
      <pubDate>Fri, 01 May 2026 11:41:05 +0000</pubDate>
      <link>https://forem.com/asafamos/why-accessibility-overlay-widgets-dont-actually-work-and-the-ftc-just-fined-one-1m-51l0</link>
      <guid>https://forem.com/asafamos/why-accessibility-overlay-widgets-dont-actually-work-and-the-ftc-just-fined-one-1m-51l0</guid>
      <description>&lt;p&gt;You've seen the button. It floats in the corner of websites — a stylized stick figure or a wheelchair icon, sometimes pulsing slightly to attract attention. Click it and a panel pops up offering "accessibility profiles" — increase contrast, larger fonts, dyslexia mode, screen reader mode, content adjustments.&lt;/p&gt;

&lt;p&gt;These are accessibility overlay widgets. accessiBe, UserWay, AudioEye, EqualWeb, and a handful of smaller vendors all sell variations of the same thing: a JavaScript file you add to your site that promises automatic ADA / WCAG compliance.&lt;/p&gt;

&lt;p&gt;They don't work, and the regulators have noticed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an overlay actually does
&lt;/h2&gt;

&lt;p&gt;The honest version is mechanical: an overlay loads in your visitor's browser, scans your DOM at runtime, and tries to patch missing accessibility attributes — adding &lt;code&gt;aria-label&lt;/code&gt; here, adjusting &lt;code&gt;role&lt;/code&gt; there, sometimes injecting a parallel UI for screen readers.&lt;/p&gt;

&lt;p&gt;The implementation is impressive on demos. The reality on shipped sites is that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Overlays can't fix what's structurally broken.&lt;/strong&gt; A &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; with a &lt;code&gt;click&lt;/code&gt; handler isn't a button just because you bolt &lt;code&gt;role="button"&lt;/code&gt; onto it. The button still won't be in the keyboard tab order, won't have a focus state, won't announce its activation. AT users still can't use it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Overlays add cognitive overhead&lt;/strong&gt; for the very users they claim to help. The 2021 Deque User Study found that screen reader users spent 60-80% of their time fighting overlay-injected ARIA, not using it. Many disable overlays as a first step on any site they visit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The fixes are bandaids.&lt;/strong&gt; When the underlying HTML changes (a new button, a new form, an updated framework), the overlay's runtime patches go stale. The site looks compliant in a snapshot test against the overlay, then drifts.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What Princeton's 2023 study actually said
&lt;/h2&gt;

&lt;p&gt;The widely-cited study on overlay effectiveness (&lt;a href="https://accessibility.princeton.edu/news/accessibility-overlays-do-not-make-website-more-accessible" rel="noopener noreferrer"&gt;Berkeley/Princeton 2023, Wagner et al&lt;/a&gt;) tested overlays against a panel of disabled users. The headline finding: &lt;strong&gt;overlays did not make websites more accessible by any measurable metric&lt;/strong&gt;, and in some cases made navigation worse for screen reader and keyboard users.&lt;/p&gt;

&lt;p&gt;The study's deeper finding: regulators evaluating WCAG conformance look at the &lt;em&gt;served HTML&lt;/em&gt; — the HTML the server returns. Runtime JavaScript modifications don't count, because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AT users frequently disable JavaScript or use AT that ignores client-side modifications&lt;/li&gt;
&lt;li&gt;Some assistive technologies parse the page before scripts execute&lt;/li&gt;
&lt;li&gt;The compliance standard (EN 301 549, referenced by EAA 2025) explicitly evaluates the server-rendered output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your compliance argument requires JavaScript to execute correctly in every visitor's browser, you don't have a compliance argument.&lt;/p&gt;

&lt;h2&gt;
  
  
  The FTC just made this expensive
&lt;/h2&gt;

&lt;p&gt;January 2025: the US Federal Trade Commission fined &lt;strong&gt;accessiBe $1 million&lt;/strong&gt; and forced a permanent injunction against deceptive accessibility claims. The complaint cited:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accessiBe marketing the overlay as making sites "fully ADA compliant"&lt;/li&gt;
&lt;li&gt;The company's own internal data showing screen reader users had material problems with sites running their widget&lt;/li&gt;
&lt;li&gt;accessiBe instructing customers to use specific marketing language that the FTC found misleading&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The settlement is here: &lt;a href="https://www.ftc.gov/news-events/news/press-releases" rel="noopener noreferrer"&gt;ftc.gov press release&lt;/a&gt;. The signal is clear: regulators are not interested in widgets that rearrange runtime ARIA over broken HTML.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually works
&lt;/h2&gt;

&lt;p&gt;The boring answer is: &lt;strong&gt;fix the source HTML and CSS&lt;/strong&gt;, then prevent regressions with continuous integration.&lt;/p&gt;

&lt;p&gt;The boring answer's expensive version is: hire an accessibility audit firm for $40K/year. They scan your site once a quarter, hand you a PDF, and recommend remediations. Most of what they find is automated — &lt;code&gt;axe-core&lt;/code&gt; would have caught it, you just paid a human to read the output.&lt;/p&gt;

&lt;p&gt;The boring answer's affordable version is: run the same automated scan as part of your CI pipeline on every pull request. Block merges on serious-severity regressions. Pair with one annual human audit (for the ~43% of WCAG criteria automated tools can't evaluate). Total cost: free CI tooling + ~$5-15K annual audit.&lt;/p&gt;

&lt;p&gt;This is what large companies have been doing for years. It's just not flashy enough to be sold as a $5K/month subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do if you're currently running an overlay
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Don't panic-uninstall.&lt;/strong&gt; The overlay isn't actively harming you (legally) until a regulator notices. Plan the migration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start with an audit of your actual HTML.&lt;/strong&gt; Use &lt;code&gt;npx axe-core/cli&lt;/code&gt; or &lt;a href="https://axle-iota.vercel.app" rel="noopener noreferrer"&gt;axle&lt;/a&gt; or any other axe-core wrapper. See what the served HTML looks like.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix the serious findings.&lt;/strong&gt; This is real work — usually 2-6 weeks of an engineer's time for a typical SaaS app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stand up CI.&lt;/strong&gt; &lt;a href="https://github.com/marketplace/actions/axle-a11y-wcag-accessibility-ci" rel="noopener noreferrer"&gt;axle GitHub Action&lt;/a&gt; and similar tools run axe-core on every PR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schedule the human audit&lt;/strong&gt; for after the CI baseline is clean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then uninstall the overlay.&lt;/strong&gt; Update your accessibility statement. Notify any procurement/customer reviews that referenced the overlay.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The frame I find useful
&lt;/h2&gt;

&lt;p&gt;Overlays are the runtime equivalent of putting "TLS" in your privacy policy without actually serving HTTPS. The label and the substance are different things. Compliance frameworks care about the substance.&lt;/p&gt;

&lt;p&gt;Real WCAG compliance is unglamorous: semantic HTML, real labels, real focus states, real keyboard navigation. There's no shortcut. The good news is the work is &lt;em&gt;bounded&lt;/em&gt; — most teams find that a one-time remediation effort plus continuous CI gets them to "passes regulator scrutiny" within a quarter.&lt;/p&gt;




&lt;p&gt;I built &lt;a href="https://axle-iota.vercel.app" rel="noopener noreferrer"&gt;axle&lt;/a&gt; because I wanted a CI-grade open-source alternative to the audit-firm tier. It's free for one repo. Full version of this post is on the canonical URL above. Drop questions in comments — happy to engage on the technical claims and the regulatory landscape.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>I built an accessibility compliance SaaS in a day with Claude Code</title>
      <dc:creator>asafamos</dc:creator>
      <pubDate>Sat, 18 Apr 2026 10:17:31 +0000</pubDate>
      <link>https://forem.com/asafamos/i-built-an-accessibility-compliance-saas-in-a-day-with-claude-code-5495</link>
      <guid>https://forem.com/asafamos/i-built-an-accessibility-compliance-saas-in-a-day-with-claude-code-5495</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — I'm not a primary coder. I spent ~12 hours on Saturday with Claude Code and shipped &lt;a href="https://axle-iota.vercel.app" rel="noopener noreferrer"&gt;axle&lt;/a&gt;: an accessibility compliance CI that scans every PR for WCAG 2.1/2.2 AA violations and proposes AI-generated code fixes. It's live on GitHub Marketplace, npm, and a hosted web UI, and processed its first real $49 transaction the same day.&lt;/p&gt;

&lt;p&gt;This is the honest play-by-play — the decisions, the dead ends, the Stripe-doesn't-serve-Israel detour, and what I'd tell someone trying to build a SaaS with AI as the primary contributor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why build this
&lt;/h2&gt;

&lt;p&gt;Three things clicked at the same time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The European Accessibility Act&lt;/strong&gt; went into force in June 2025. Every company selling into the EU now needs WCAG 2.1 AA. Fines up to €1M per violation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The FTC fined accessiBe $1 million&lt;/strong&gt; in January 2025 for misleading AI claims about their overlay widget. That whole product category is legally radioactive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Sonnet 4.6&lt;/strong&gt; is good enough at targeted code fixes that the "AI auto-fix" pitch isn't marketing anymore — it actually works for ~60-75% of WCAG violations on realistic pages.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The wedge: real code fixes proposed as PR diffs, bundled with the legal artifacts a compliance officer actually needs (audit trail, accessibility statement, monitoring). Scanners are a commodity. The workflow isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack I settled on
&lt;/h2&gt;

&lt;p&gt;Every piece was chosen for "fastest path to first real revenue":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16 on Vercel&lt;/strong&gt; — App Router, server components. &lt;code&gt;vercel deploy --prod&lt;/code&gt; in 30 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playwright + axe-core 4.11&lt;/strong&gt; — the industry-standard scanner, wrapped in a headless Chromium.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/sparticuz"&gt;@sparticuz&lt;/a&gt;/chromium&lt;/strong&gt; — the serverless-compatible Chromium build. Needed once I realized Vercel functions don't ship a full browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Sonnet 4.6&lt;/strong&gt; via the Anthropic SDK, with ephemeral prompt caching. Per-fix cost is ~$0.008.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upstash Redis&lt;/strong&gt; (via Vercel Marketplace, one click) for API-key storage and rate limiting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resend&lt;/strong&gt; for transactional email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polar.sh&lt;/strong&gt; as the merchant of record. This one deserves its own section.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Stripe problem (and why Polar saved the day)
&lt;/h2&gt;

&lt;p&gt;I'm Israeli. Stripe's dropdown for &lt;code&gt;Business Location&lt;/code&gt; on a new account does not include Israel. I stared at it for ten minutes. I scrolled twice. No Israel.&lt;/p&gt;

&lt;p&gt;Paddle was option B. I tried — and discovered my old Paddle account had been rejected years ago for an unrelated product (Swap-video, a face-swap tool that violated their acceptable use policy). Appeals exist, but take days.&lt;/p&gt;

&lt;p&gt;Polar.sh (an MoR on top of Stripe Connect) was option C. Clean signup, no prior baggage, full KYC in one afternoon including identity verification. Bank account linked directly to my Israeli bank in USD. First real $49 charge processed end-to-end inside of six hours after signup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a non-US founder building SaaS in 2026&lt;/strong&gt;: Polar.sh is the path.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Claude Code actually feels as the primary contributor
&lt;/h2&gt;

&lt;p&gt;I drove with a conversational loop: describe the next chunk, review the diff, ask for iteration. Claude wrote ~90% of the characters. What mattered from my side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Knowing what I wanted at the product level&lt;/strong&gt; (the pricing tiers, the legal positioning, the anti-overlay stance).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Catching when Claude over-engineered&lt;/strong&gt; (it loves defensive programming; I rejected about a third of the try/catch blocks).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forcing narrow scope&lt;/strong&gt; (one feature at a time; no "while we're at it" refactors).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recovering from dead ends fast&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The part Claude does &lt;em&gt;not&lt;/em&gt; do for you: talking to customers, writing positioning copy that actually converts, choosing which channel to launch on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Distribution, day one
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Marketplace&lt;/strong&gt; — &lt;code&gt;asafamos/axle-action@v1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt; — &lt;code&gt;axle-cli&lt;/code&gt; and &lt;code&gt;axle-netlify-plugin&lt;/code&gt; published.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web UI&lt;/strong&gt; — scan widget + Hebrew accessibility statement generator + embeddable compliance badge, all at &lt;code&gt;axle-iota.vercel.app&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scaffolds ready for Raycast, Chrome, Cloudflare Pages&lt;/strong&gt; — publishing over the week.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every output carries a "Powered by axle" trail: PR comments, generated statements, the badge itself (which is a backlink by definition). The product is the funnel.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Legal pressure beats feature richness.&lt;/strong&gt; The EAA/ADA/Israeli-law positioning converts better than any feature list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYC is the real bottleneck for non-US founders.&lt;/strong&gt; Not coding. Not marketing. The paperwork.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claude Code without product taste produces plausible-looking mush. With product taste, it produces shippable software in hours.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "AI auto-fix" claim is defensible only with honest confidence scoring.&lt;/strong&gt; Every fix axle generates ships with a confidence score and a manual-review flag.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;More marketplace integrations — Cloudflare, Raycast, Chrome, VS Code.&lt;/li&gt;
&lt;li&gt;Multi-language accessibility statements (French, German, Spanish) for full EAA coverage.&lt;/li&gt;
&lt;li&gt;Custom domain, ProductHunt launch, and the inevitable "I scanned the top 100 SaaS landing pages" content marketing piece.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to try axle (free tier: 1 repo, unlimited scans, bring your own Anthropic key):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scan any URL: &lt;a href="https://axle-iota.vercel.app" rel="noopener noreferrer"&gt;axle-iota.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Install the Action: &lt;a href="https://github.com/marketplace/actions/axle-accessibility-compliance-ci" rel="noopener noreferrer"&gt;github.com/marketplace/actions/axle-accessibility-compliance-ci&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;npx axle-cli scan https://your-site.com&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;axle provides remediation assistance, not a compliance certificate. Automated tools catch ~57% of WCAG issues; manual human review is still recommended.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>ai</category>
      <category>saas</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
