<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged accessibility</title>
<link>https://coderlegion.com/tag/accessibility</link>
<description>Powered by Question2Answer</description>
<item>
<title>When Should Delete Offer Undo?</title>
<link>https://coderlegion.com/32495/when-should-delete-offer-undo</link>
<description>&lt;p&gt;Undo is useful only when it genuinely restores what the user lost. A confirmation dialog is useful only when it explains the consequence—not just “Are you sure?”&lt;/p&gt;
&lt;p&gt;Consider a hypothetical media app where someone deletes a set of property photos. My starting point would be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reversible removal:&lt;/strong&gt; move files to trash, show a clear Undo action, and keep a discoverable recovery route after the toast disappears.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Permanent or bulk deletion:&lt;/strong&gt; show the affected names or count, what cannot be restored, and whether shared access will be affected before proceeding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partial failure:&lt;/strong&gt; report which files changed instead of claiming the entire operation succeeded.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The tricky case is shared assets: restoring a file may not reverse notifications or other effects that already happened.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html&quot;&gt;W3C’s error-prevention guidance&lt;/a&gt; provides a useful reference for certain important submissions and changes to user-controllable stored data: reversal, checking, or confirmation. It does not mean adding a confirmation dialog to every routine edit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where do you draw the line between Undo, confirmation, and both?&lt;/strong&gt; Would your answer change for one recoverable file versus a folder shared with a team?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cover: original AI-generated conceptual illustration. The interfaces and recovery period shown are fictional, not a product demonstration.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Discussions</category>
<guid isPermaLink="true">https://coderlegion.com/32495/when-should-delete-offer-undo</guid>
<pubDate>Mon, 26 Oct 2026 10:29:03 +0000</pubDate>
</item>
<item>
<title>When Is a Progress Bar Misleading?</title>
<link>https://coderlegion.com/32377/when-is-a-progress-bar-misleading</link>
<description>&lt;p&gt;A progress bar should tell users what has been measured, not just reassure them that something is happening.&lt;/p&gt;
&lt;p&gt;Consider a hypothetical photo-processing tool: upload progress is measurable in bytes, but the next step might wait in a queue or take a different amount of time for each image. A bar that reaches 99% and then stalls can turn a useful signal into false precision.&lt;/p&gt;
&lt;p&gt;My proposed default would be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use a percentage for work with a meaningful, known total.&lt;/li&gt;
&lt;li&gt;Use explicit stages such as &lt;strong&gt;Queued → Processing → Ready&lt;/strong&gt; when completion time is uncertain.&lt;/li&gt;
&lt;li&gt;Show completed-file counts for batches, while making clear that files may take different amounts of time.&lt;/li&gt;
&lt;li&gt;Keep failure and cancellation states separate from progress.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is an accessibility detail too: status updates should be available to assistive technology without moving keyboard focus. &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html&quot;&gt;W3C's guidance on status messages&lt;/a&gt; also warns against making updates too chatty; announcing every tick is not necessarily helpful.&lt;/p&gt;
&lt;p&gt;Where would you draw the line between a useful estimate and false precision? Would you show stage labels, an estimated range, or a percentage when processing time varies?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cover: original AI-generated concept illustration of fictional processing interfaces, not a product screenshot or performance result.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Discussions</category>
<guid isPermaLink="true">https://coderlegion.com/32377/when-is-a-progress-bar-misleading</guid>
<pubDate>Sun, 25 Oct 2026 10:26:33 +0000</pubDate>
</item>
<item>
<title>Image SEO in 2026: Alt Text, Modern Formats and Fast Loading</title>
<link>https://coderlegion.com/32142/image-seo-in-2026-alt-text-modern-formats-and-fast-loading</link>
<description>&lt;p&gt;Image SEO in 2026 boils down to three jobs: describe every image accurately, deliver it fast, and make it discoverable and attributable. This guide covers each with copy-ready HTML, sticking to what Google, web.dev and the browser makers actually document.&lt;/p&gt;
&lt;p&gt;It starts with a rule that catches many modern sites: Google indexes images in an img element (including inside picture) but not images set as CSS backgrounds. Then description: alt text that says what the image shows and why it's there, in plain words, with empty alt for decoration and any text inside a graphic repeated in the alt. Filenames, captions, nearby text and page titles all help Google understand an image, and the title attribute isn't a substitute for alt.&lt;/p&gt;
&lt;p&gt;For speed, I recommend serving AVIF or WebP through a picture element with a JPEG or PNG fallback (and making sure the server sends the right content type), setting width and height on every image to prevent layout shift, using srcset with sizes so phones don't download desktop files, lazy-loading below the fold, and never lazy-loading the main image, which should get fetchpriority=&quot;high&quot; instead.&lt;/p&gt;
&lt;p&gt;I also cover image sitemaps, the image property in structured data, licence metadata for Google's Licensable badge, and what's actually documented about Google Lens and multimodal AI Mode: use your own photos and explain them in text nearby. A checklist and honest limits close it out.&lt;/p&gt;
&lt;h4 id=&quot;key-takeaways&quot;&gt;Key takeaways&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Use real img elements; CSS background images aren't indexed&lt;/li&gt;
&lt;li&gt;Write alt text that describes what the image shows&lt;/li&gt;
&lt;li&gt;Serve AVIF or WebP with a fallback&lt;/li&gt;
&lt;li&gt;Always set width and height to prevent layout shift&lt;/li&gt;
&lt;li&gt;Lazy-load below the fold, but prioritise the hero image&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Related on BuiltToWinWeb: &lt;a rel=&quot;nofollow&quot; href=&quot;https://built2winweb.com/blog/what-makes-a-website-load-fast/&quot;&gt;what makes a website load fast&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Read the full guide on BuiltToWinWeb:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://built2winweb.com/blog/image-seo-2026/&quot;&gt;&lt;strong&gt;The image SEO guide for 2026&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A summary by Jacob Campbell of an article first published on built2winweb.com on October 7, 2026.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32142/image-seo-in-2026-alt-text-modern-formats-and-fast-loading</guid>
<pubDate>Fri, 23 Oct 2026 04:00:46 +0000</pubDate>
</item>
<item>
<title>Can a Keyboard-Only User Finish Your App’s Main Task?</title>
<link>https://coderlegion.com/31692/can-a-keyboard-only-user-finish-your-apps-main-task</link>
<description>&lt;p&gt;Pick the main task in your web app: submitting a form, uploading a file, booking an appointment, or creating a project.&lt;/p&gt;
&lt;p&gt;Now put the mouse aside and try to finish it using the keyboard.&lt;/p&gt;
&lt;p&gt;Where does the journey first become confusing or impossible?&lt;/p&gt;
&lt;p&gt;Some useful places to check:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A custom dropdown that opens but cannot be operated&lt;/li&gt;
&lt;li&gt;A dialog that opens without a clear focus position&lt;/li&gt;
&lt;li&gt;A validation error that appears somewhere the user does not notice&lt;/li&gt;
&lt;li&gt;A drag-and-drop interaction with no usable alternative&lt;/li&gt;
&lt;li&gt;A focus indicator that disappears against the background&lt;/li&gt;
&lt;li&gt;A component you can enter but cannot leave&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;W3C’s &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html&quot;&gt;keyboard accessibility guidance&lt;/a&gt; explains why functionality needs a keyboard-operable route, with a limited exception for inherently path-dependent input. Its &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html&quot;&gt;no-keyboard-trap guidance&lt;/a&gt; addresses being able to leave a component again.&lt;/p&gt;
&lt;p&gt;A keyboard walkthrough is a useful first check. It does not establish full accessibility or replace screen-reader and other accessibility testing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is one keyboard-accessibility bug your team found late, and what changed in your development or review process afterward?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you are building something new, which critical flow will you test first?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Waqas Ahmad | Software Engineer | Content Creator&lt;/em&gt;&lt;/p&gt;
</description>
<category>Discussions</category>
<guid isPermaLink="true">https://coderlegion.com/31692/can-a-keyboard-only-user-finish-your-apps-main-task</guid>
<pubDate>Mon, 19 Oct 2026 07:41:47 +0000</pubDate>
</item>
<item>
<title>My GitHub Sponsors Is Live: Help Me Build Creative Tools Blind People Can Actually Use</title>
<link>https://coderlegion.com/31100/my-github-sponsors-is-live-help-me-build-creative-tools-blind-people-can-actually-use</link>
<description>&lt;p&gt;After months of waiting, my GitHub Sponsors profile is finally live! 🎉&lt;/p&gt;
&lt;h3 id=&quot;who-i-am&quot;&gt;Who I am&lt;/h3&gt;
&lt;p&gt;I'm Demir Ajvazi, a blind developer from Serbia. I've been using the JAWS screen reader for about 20 years. For most of that time, I've watched creative software lock out people like me: professional video, audio and photo editors are nearly impossible to use with a screen reader.&lt;/p&gt;
&lt;h3 id=&quot;what-i-m-building&quot;&gt;What I'm building&lt;/h3&gt;
&lt;p&gt;So I started building the &lt;strong&gt;Ultra Creative Suite&lt;/strong&gt;: open-source creative tools designed from the ground up to work equally well for blind and sighted users. Not a stripped-down &quot;accessible mode&quot;, and not a workaround, but real tools that both blind and sighted creators can use side by side.&lt;/p&gt;
&lt;p&gt;Alongside the suite, I'm working on other accessible tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UltraShield&lt;/strong&gt;: an accessible digital self-defense app for Windows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ultra Uninstaller&lt;/strong&gt;: a Windows uninstaller and cleaner that is fully usable with a screen reader&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ultra Bridge&lt;/strong&gt;: a JAWS and NVDA command-mapping helper&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can find everything here: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/demirajvazi10-max&quot;&gt;github.com/demirajvazi10-max&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;how-you-can-help&quot;&gt;How you can help&lt;/h3&gt;
&lt;p&gt;If you believe blind people deserve the same creative tools as everyone else, you can now support my work directly:&lt;/p&gt;
&lt;p&gt;👉 &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/sponsors/demirajvazi10-max&quot;&gt;github.com/sponsors/demirajvazi10-max&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Monthly sponsorships start at $3, and one-time support is welcome too. Every contribution goes directly into development and keeps everything free and open source.&lt;/p&gt;
&lt;p&gt;Can't sponsor? That's completely fine. Sharing this post, starring a repo, or trying the apps with a screen reader and telling me what doesn't work helps just as much.&lt;/p&gt;
&lt;p&gt;Thank you for reading!&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/31100/my-github-sponsors-is-live-help-me-build-creative-tools-blind-people-can-actually-use</guid>
<pubDate>Wed, 14 Oct 2026 16:46:58 +0000</pubDate>
</item>
<item>
<title>AmazingPlugins</title>
<link>https://coderlegion.com/31045/amazingplugins</link>
<description>&lt;p&gt;Every WooCommerce store owner knows the feeling. An order gets stuck in processing, a customer emails to say the checkout button does nothing with a screen reader, or a price change across two hundred products eats a whole afternoon. These are not exotic problems. They are the everyday friction of running a real shop, and they quietly cost sales.&lt;/p&gt;
&lt;p&gt;The usual answer is a heavy premium plugin, a monthly subscription, or a script that sits on top of your theme and pretends to fix things. There is a better way: small, focused, free tools that solve one problem properly.&lt;/p&gt;
&lt;p&gt;Accessibility is a good example. Many &quot;accessibility&quot; products add an overlay widget that changes how the page looks without touching the underlying code. Assistive technology still meets the same broken markup. A real fix means correcting the HTML itself: proper labels on form fields, meaningful button names, sensible heading order, and focus that lands where a keyboard user expects. Accessibility Fixer from AmazingPlugins does exactly that inside WooCommerce, so the improvement is in the page, not painted over it.&lt;/p&gt;
&lt;p&gt;Order problems deserve the same treatment. Orders that never leave pending, statuses that drift out of sync with payments, and stock that does not match reality all create support tickets. Order Fixer looks for these common breakages and helps you put them right without exporting spreadsheets or editing the database by hand.&lt;/p&gt;
&lt;p&gt;Bulk editing is next. Smart Bulk Editor, coming soon, is built to let you change prices, stock and attributes across many products quickly and safely.&lt;/p&gt;
&lt;p&gt;The idea behind all of this is simple. A store owner should be able to install a free tool, see the problem fixed, and move on with the day. No bait and switch, no surprise paywall halfway through a task. If your WooCommerce shop has any of these headaches, take a look at the free plugins at &lt;a rel=&quot;nofollow&quot; href=&quot;https://amazingplugins.com&quot;&gt;https://amazingplugins.com&lt;/a&gt; and pick the one that matches your problem.&lt;/p&gt;
</description>
<category>Launches</category>
<guid isPermaLink="true">https://coderlegion.com/31045/amazingplugins</guid>
<pubDate>Wed, 14 Oct 2026 10:51:32 +0000</pubDate>
</item>
<item>
<title>Your Repo Can Now Tell People It Cares About Accessibility</title>
<link>https://coderlegion.com/30853/your-repo-can-now-tell-people-it-cares-about-accessibility</link>
<description>&lt;p&gt;Open any repository on GitHub and you see the same tabs: README, Code of Conduct, Contributing, Security. As of October 1, there can be one more: &lt;strong&gt;Accessibility&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;GitHub now &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.blog/changelog/2026-10-01-accessibility-statements-highlighted-on-repository-overview/&quot;&gt;highlights an &lt;code&gt;ACCESSIBILITY.md&lt;/code&gt; file&lt;/a&gt; on the repository overview and links to it from the About section. It is a small change, and it puts accessibility on the front page of your project, next to the files every contributor already reads.&lt;/p&gt;
&lt;p&gt;We added one to &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/BRIKEV/twd&quot;&gt;TWD&lt;/a&gt; right away. Here is why, and what we learned.&lt;/p&gt;
&lt;h3 id=&quot;why-it-matters&quot;&gt;Why it matters&lt;/h3&gt;
&lt;p&gt;Picture someone who uses a screen reader trying out your library. Something in the docs doesn't work for them. Today, they have to guess: is this a known issue? Does anyone care? Where do I even report it?&lt;/p&gt;
&lt;p&gt;An accessibility page answers all three before they ask. It says this project takes accessibility seriously, here is what we have tested, and here is how to tell us when something gets in your way.&lt;/p&gt;
&lt;p&gt;It also helps the other side. Contributors see, in plain words, what is expected of a change that touches the UI.&lt;/p&gt;
&lt;h3 id=&quot;what-we-put-in-ours&quot;&gt;What we put in ours&lt;/h3&gt;
&lt;p&gt;TWD had a head start. In June we had it independently audited against WCAG 2.2 AA, fixed what the auditors found, and published a formal &lt;a rel=&quot;nofollow&quot; href=&quot;https://twd.dev/accessibility-statement&quot;&gt;accessibility statement&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We expected to copy and paste that statement. We didn't. A formal statement is written for compliance. The GitHub page is written for people, so we wrote it in plain language around three ideas:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be honest about what was tested.&lt;/strong&gt; Our audit covered the sidebar and the main docs pages, using a keyboard and the NVDA screen reader. So that is what the page claims. For everything else, WCAG 2.2 AA is our goal, and we say so.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make reporting easy.&lt;/strong&gt; Open an issue, send an email, or ask in Discussions. No need to know which guideline is involved, and no need to share anything personal. We commit to replying within 5 business days.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tell contributors what good looks like.&lt;/strong&gt; Keep it usable with a keyboard, keep focus visible, don't rely on colour alone, and include light and dark screenshots with UI changes.&lt;/p&gt;
&lt;p&gt;You can read the result here: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/BRIKEV/twd/blob/main/ACCESSIBILITY.md&quot;&gt;TWD's ACCESSIBILITY.md&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;add-one-to-your-project&quot;&gt;Add one to your project&lt;/h3&gt;
&lt;p&gt;You don't need an audit to start. You need an honest page.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create &lt;code&gt;ACCESSIBILITY.md&lt;/code&gt; in your repo root (or in &lt;code&gt;.github/&lt;/code&gt; or &lt;code&gt;docs/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Start from &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/adding-an-accessibility-page-to-your-repository&quot;&gt;GitHub's template&lt;/a&gt;, or add it from your repo's &lt;strong&gt;Community Standards&lt;/strong&gt; page.&lt;/li&gt;
&lt;li&gt;Fill in the two sections that matter most: how to report a barrier, and what you have and haven't tested.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That's it. The tab appears on your repo's front page.&lt;/p&gt;
&lt;p&gt;Accessibility work usually happens out of sight. Now it has a place on your repo's front page, where users and contributors will see it.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30853/your-repo-can-now-tell-people-it-cares-about-accessibility</guid>
<pubDate>Mon, 12 Oct 2026 18:17:21 +0000</pubDate>
</item>
<item>
<title>FOUC-Proof Retro Design Systems</title>
<link>https://coderlegion.com/29604/fouc-proof-retro-design-systems</link>
<description>&lt;p&gt;When building web interfaces with a retro arcade aesthetic, developers often adopt vibrant neon color palettes to recreate an 80s terminal feel. However, applying these bright accents directly across both light and dark surfaces introduces two critical problems. First, neon shades like electric cyan frequently fail minimum WCAG contrast requirements against pale backgrounds, dropping below the 4.5 to 1 ratio needed for accessibility. Second, relying on client-side JavaScript or late-loading framework components to manage theme state causes a jarring Flash of Unstyled Content or white flash during document parsing. Solving these issues requires combining asymmetric color calibration with synchronous pre-render execution in static site generators like Astro. For a related implementation, see &lt;a rel=&quot;nofollow&quot; href=&quot;https://raylabs.app/articles/android-offline-first-event-pipeline/&quot;&gt;Offline First Event Pipeline&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;the-pitfall-of-retro-aesthetics-on-the-web&quot;&gt;The Pitfall of Retro Aesthetics on the Web&lt;/h3&gt;
&lt;p&gt;Nostalgic design systems rely heavily on high-contrast neon tones to establish character. While electric cyan or neon green looks striking against a dark matte chassis, using those exact same hex codes on a light background destroys readability. A color that passes contrast checks in a dark environment will often wash out completely on a light surface. Attempting to fix this by handcoding individual theme styles across disparate components leads to code duplication and visual fragmentation. Maintaining a cohesive brand identity requires a structured token architecture that adapts semantically depending on the active theme mode.&lt;/p&gt;
&lt;h3 id=&quot;the-mathematics-of-accessible-contrast&quot;&gt;The Mathematics of Accessible Contrast&lt;/h3&gt;
&lt;p&gt;To keep a consistent visual identity without sacrificing readability, the color system must use dual-role semantic token calibration. Instead of forcing identical accent values in both modes, the primary accent variable shifts based on the document theme attribute. In light mode, the system switches to a calibrated deep arcade teal that achieves a WCAG AAA contrast ratio against pale surfaces. In dark mode, it returns to the high-vibrancy electric cyan. Secondary accents, such as a high-energy orange tone, serve consistently as action indicators. The following CSS custom property configuration demonstrates how to structure these semantic tokens at the root level: For a related implementation, see &lt;a rel=&quot;nofollow&quot; href=&quot;https://raylabs.app/articles/audit-macos-system-data-before-deleting-developer-caches/&quot;&gt;Audit Macos System Data Before Deleting&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;:root {
  --surface: #fbfcfc;
  --surface-raised: #f0f2f5;
  --text-main: #111418;
  --accent: #007e85;
  --accent-secondary: #ff5722;
  --line: #d1d5db;
}

[data-theme=&quot;dark&quot;] {
  --surface: #0e1114;
  --surface-raised: #161b22;
  --text-main: #f0f6fc;
  --accent: #00adb5;
  --accent-secondary: #ff5722;
  --line: #30363d;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;eliminating-fouc-with-synchronous-head-scripts&quot;&gt;Eliminating FOUC with Synchronous Head Scripts&lt;/h3&gt;
&lt;p&gt;Even with well-structured CSS variables, waiting for external stylesheets or framework hydration to apply the correct theme attribute creates visual flicker. Client-side scripts that execute inside &lt;code&gt;DOMContentLoaded&lt;/code&gt; or standard component lifecycles run too late in the rendering pipeline. To eliminate this delay, a blocking script must execute synchronously inside the document head before the body layout paints. By checking &lt;code&gt;localStorage&lt;/code&gt; or &lt;code&gt;prefers-color-scheme&lt;/code&gt; immediately, the browser can set the target attribute and background color instantly. The following component snippet illustrates how to implement this pattern in an Astro layout:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;script is:inline&amp;gt;
  const storedTheme = localStorage.getItem('theme');
  const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
  const theme = storedTheme || (prefersDark ? 'dark' : 'light');
  
  document.documentElement.setAttribute('data-theme', theme);
  if (theme === 'dark') {
    document.documentElement.style.backgroundColor = '#0e1114';
  } else {
    document.documentElement.style.backgroundColor = '#fbfcfc';
  }
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;maintaining-a-single-source-of-truth&quot;&gt;Maintaining a Single Source of Truth&lt;/h3&gt;
&lt;p&gt;Scaling a token-based design system across static sites and standalone tools requires clear organizational boundaries. Core platform utilities like extension showcases or isolated calculators may demand independent UI scopes, but editorial and reading surfaces must consume global design variables uniformly. Desktop reading aids, active bullet indicators, and border lines should bind directly to semantic variables like &lt;code&gt;--accent&lt;/code&gt; and &lt;code&gt;--line&lt;/code&gt; rather than hardcoded color values. Keeping these token mappings documented in a versioned reference file ensures consistency across design vaults and code repositories without introducing runtime overhead.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29604/fouc-proof-retro-design-systems</guid>
<pubDate>Sat, 03 Oct 2026 09:06:20 +0000</pubDate>
</item>
<item>
<title>What a 100 Accessibility Score Didn't Check</title>
<link>https://coderlegion.com/29402/what-a-100-accessibility-score-didnt-check</link>
<description>&lt;p&gt;&lt;em&gt;Originally published on Hashnode: &lt;a rel=&quot;nofollow&quot; href=&quot;https://tarek-elzoghby.hashnode.dev/what-a-100-accessibility-score-didn-t-check&quot;&gt;https://tarek-elzoghby.hashnode.dev/what-a-100-accessibility-score-didn-t-check&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Lighthouse gave my practice site a 100 for accessibility. Then I went through it by hand, checking what Lighthouse doesn't, and found a markup mistake that neither Lighthouse nor a screen reader had flagged. This post covers what I checked, what I found, and what I changed.&lt;/p&gt;
&lt;p&gt;I built a one-page site for a made-up potter as a practice brief: hero, about, gallery, contact. The client and the name are fictional. I worked with an AI as a design partner throughout, mostly to review my HTML and talk through decisions before I made them. The code is &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Tarek-Elzoghby/client-brief-01-ceramics-studio&quot;&gt;on GitHub&lt;/a&gt;. This post is only about the last stretch, after everything was built, when I went back through it for accessibility.&lt;/p&gt;
&lt;h3 id=&quot;the-baseline&quot;&gt;The baseline&lt;/h3&gt;
&lt;p&gt;Lighthouse gave me 99 Performance, 95 Accessibility, 100 Best Practices, and 91 SEO. Accessibility had exactly one complaint: the three contact links had low color contrast.&lt;/p&gt;
&lt;p&gt;The links were set in terracotta (&lt;code&gt;#B5603F&lt;/code&gt;) on a cream background, which comes to about 3.9:1. Normal-size text needs 4.5:1 to pass WCAG AA (the conformance level most sites aim for). Terracotta was the single accent color in the whole design, reserved for real calls to action, so I didn't want to drop it. The palette already had &lt;code&gt;--color-primary-dark&lt;/code&gt;, a darker shade I'd originally made for hover states. I pointed the links at that instead. Accessibility went to 100 from that one change.&lt;/p&gt;
&lt;p&gt;The link color had looked fine to me by eye, and it failed anyway. That's why I ran the audit at all.&lt;/p&gt;
&lt;h3 id=&quot;what-the-100-covers&quot;&gt;What the 100 covers&lt;/h3&gt;
&lt;p&gt;A Lighthouse score covers the checks Lighthouse runs. It says nothing about the ones it doesn't. So I went through the site by hand, looking for gaps.&lt;/p&gt;
&lt;h3 id=&quot;decorative-icons&quot;&gt;Decorative icons&lt;/h3&gt;
&lt;p&gt;The contact section has three inline SVG icons (email, phone, Instagram), each next to a text label that says the same thing. Screen readers handle inline SVGs inconsistently. Some announce &quot;graphic,&quot; some read out raw markup, some skip them. Nothing breaks, but the experience is unpredictable, and the icons carry no information the label doesn't already carry.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;svg class=&quot;contact-icon&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; ...&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;aria-hidden=&quot;true&quot;&lt;/code&gt; removes the icon from the accessibility tree (what assistive technology reads instead of the visual page). &lt;code&gt;focusable=&quot;false&quot;&lt;/code&gt; is a safety net for older IE and Edge, where SVGs could be focusable by default and pick up a stray tab stop.&lt;/p&gt;
&lt;h3 id=&quot;landmarks&quot;&gt;Landmarks&lt;/h3&gt;
&lt;p&gt;Lighthouse checks that basic page structure is present. It doesn't check whether landmarks are useful. &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; gave me one landmark for free. The four blocks inside it (hero, about, gallery, contact) weren't landmarks at all. A plain &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; only becomes a region landmark once it has an accessible name, and &lt;code&gt;&amp;lt;address&amp;gt;&lt;/code&gt; has no landmark role by default.&lt;/p&gt;
&lt;p&gt;So the question I worked out before touching any markup was which sections are places someone would want to jump to. Having a heading wasn't the test.&lt;/p&gt;
&lt;p&gt;The hero is where a screen reader user already lands, so making it a landmark would only add a &quot;you are here&quot; entry to the jump list. About, Gallery, and Contact are content someone might skip straight to. Those three got landmark status.&lt;/p&gt;
&lt;p&gt;For About and Gallery, I gave the &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; inside each an id and pointed the parent section at it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;section aria-labelledby=&quot;about-heading&quot;&amp;gt;
  &amp;lt;h2 id=&quot;about-heading&quot;&amp;gt;About me&amp;lt;/h2&amp;gt;
  ...
&amp;lt;/section&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Contact was different. Its wrapper was an &lt;code&gt;&amp;lt;address&amp;gt;&lt;/code&gt;, and &lt;code&gt;aria-labelledby&lt;/code&gt; on an element with no landmark role names something that was never a landmark. I added &lt;code&gt;role=&quot;region&quot;&lt;/code&gt; alongside it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;address role=&quot;region&quot; aria-labelledby=&quot;contact-heading&quot;&amp;gt;
  &amp;lt;h2 id=&quot;contact-heading&quot;&amp;gt;Contact&amp;lt;/h2&amp;gt;
  ...
&amp;lt;/address&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Contact is as much a jump-to destination as the other two, and its tag choice shouldn't make it the odd one out. That got it into the landmark list, and it was still wrong. &lt;code&gt;&amp;lt;address&amp;gt;&lt;/code&gt; is for contact details, and the HTML spec doesn't allow heading elements inside it, so the &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; there was invalid markup. I found this later, when the AI reviewed the repo again before I wrote this post. Nothing I had run flagged it, and NVDA (a free screen reader for Windows) listed the region as if nothing were off.&lt;/p&gt;
&lt;p&gt;The fix was smaller than I expected. I changed the wrapper from &lt;code&gt;&amp;lt;address&amp;gt;&lt;/code&gt; to &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; and removed &lt;code&gt;role=&quot;region&quot;&lt;/code&gt;. Everything else stayed the same:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;section class=&quot;contact&quot; aria-labelledby=&quot;contact-heading&quot;&amp;gt;
  &amp;lt;div class=&quot;address-content&quot;&amp;gt;
    &amp;lt;h2 id=&quot;contact-heading&quot;&amp;gt;Contact&amp;lt;/h2&amp;gt;
    ...
  &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; with an accessible name is already a region, so once the tag was right the role had nothing left to do.&lt;/p&gt;
&lt;h3 id=&quot;checking-it&quot;&gt;Checking it&lt;/h3&gt;
&lt;p&gt;Reading markup only tells me what I intended. I opened NVDA's Elements List (NVDA+F7) and filtered to Landmarks. It showed the implicit &lt;code&gt;main&lt;/code&gt; plus three named regions: About me, Recent Work, and Contact. The hero was correctly absent and nothing was duplicated.&lt;/p&gt;
&lt;p&gt;That check passed on the version with the invalid &lt;code&gt;&amp;lt;address&amp;gt;&lt;/code&gt;. It tells me what a screen reader is given, not whether the markup is valid. Validity is a separate check, and the W3C validator is the one that covers it.&lt;/p&gt;
&lt;h3 id=&quot;what-s-still-open&quot;&gt;What's still open&lt;/h3&gt;
&lt;p&gt;Accessibility is at 100. I left SEO at 91 on purpose. What remains there depends mostly on the meta description and real content, which is better written once real copy and photos exist than guessed at now.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;What does your accessibility pass cover that Lighthouse doesn't? I'm still building my own list and would like to see yours.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29402/what-a-100-accessibility-score-didnt-check</guid>
<pubDate>Thu, 01 Oct 2026 11:55:45 +0000</pubDate>
</item>
<item>
<title>Your site looks AI-generated. Here's how to fix it</title>
<link>https://coderlegion.com/28583/your-site-looks-ai-generated-heres-how-to-fix-it</link>
<description>&lt;p&gt;The default look is underspecified taste, not a hard model limit. Brief with references, name visitor jobs, then audit the live URL and accessibility tree.&lt;/p&gt;
&lt;p&gt;Stakeholders rarely say “your typography hierarchy is weak.” They say the site looks AI-generated. That complaint is usually accurate about &lt;strong&gt;defaults&lt;/strong&gt;, not proof that models cannot ship distinctive work. When the brief is vague (“modern”, “clean”, “premium”), generators and humans both fall back on the same training-set average: indigo heroes, three feature cards, Inter everywhere, and copy that could sell any SaaS.&lt;/p&gt;
&lt;p&gt;Banning AI assistance does not fix the average. Removing the average from the brief before the first generation does, then two honest passes on the live URL. We learned that the hard way while shipping Apogee Watcher’s public site: without written design rules, every agent draft drifted toward the same marketing-site defaults (soft shadows, rounded cards, stock gradients). The steps below are what we use on our marketing pages and on client landing pages. They clean generic defaults. They do not replace a designer for a full brand system.&lt;/p&gt;
&lt;h3 id=&quot;why-the-ai-look-shows-up-so-often&quot;&gt;Why the AI look shows up so often&lt;/h3&gt;
&lt;p&gt;Public UI training data is heavy on starter kits, component demos, and tutorial landings. Predictable next tokens therefore favour the same layout grammar and the same safe palette. Teams amplify that by pasting soft adjectives into the prompt and accepting the first render that “looks done.”&lt;/p&gt;
&lt;p&gt;The fingerprint is easy to list once you have seen it twice: cool purple-to-blue gradients, evenly rounded cards with soft shadows, icon rows with abstract nouns, and body copy that starts with &lt;em&gt;empower&lt;/em&gt;, &lt;em&gt;unlock&lt;/em&gt;, or &lt;em&gt;transform&lt;/em&gt;. None of those choices is illegal. Together they look like a template nobody chose on purpose.&lt;/p&gt;
&lt;p&gt;On Watcher we treat that fingerprint as a reject list, not a mood board. Our public design system (Technical Brutalism) bans purple or indigo gradients, glass, pill-shaped buttons, blurred shadows, and a second typeface beside Victor Mono. Depth comes from 2px charcoal borders and hard offset shadows (&lt;code&gt;4px 4px 0&lt;/code&gt;), not from glow. The first pass that ignored those bans looked “finished” and still read like every other monitoring landing page. The pass that named the bans in the brief stopped inventing soft polish we would have deleted anyway.&lt;/p&gt;
&lt;p&gt;Performance and accessibility suffer in the same pass. Generic hero images arrive oversized. Consent banners and chat widgets appear late and shift layout. Focus order follows the card grid rather than the visitor’s job. That is why this craft problem sits next to monitoring work as often as it sits next to Figma.&lt;/p&gt;
&lt;h3 id=&quot;pass-one-brief-the-agent-with-references-and-reasons&quot;&gt;Pass one: brief the agent with references and reasons&lt;/h3&gt;
&lt;p&gt;A short brief the model (or a junior) cannot ignore usually includes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Two to five visual references&lt;/strong&gt; with a one-line &lt;em&gt;why&lt;/em&gt; for each (“asymmetric hero like reference A because the product is a dashboard, not a brochure”).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Palette tokens that are not stock indigo/slate&lt;/strong&gt;, named for your brand, not for Tailwind’s defaults.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One typography pairing&lt;/strong&gt; with roles (display vs body), not “use a nice sans.”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layout constraints&lt;/strong&gt; that break the vertical stack (offset columns, full-bleed media, or a single strong edge).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Banned phrases and banned class patterns&lt;/strong&gt; you will reject in review.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Our Watcher brief is concrete enough that a stranger could reject a bad render without a design review meeting. Primary orange is &lt;code&gt;#ff6633&lt;/code&gt; on charcoal &lt;code&gt;#2e2e2e&lt;/code&gt;, not “energetic accent.” Type is Victor Mono only, uppercase for display and buttons, with no Inter, Geist, or system sans as a fallback. Corners stay square except on score gauges and status dots. Section voice uses code-style decorations (&lt;code&gt;//&lt;/code&gt; headings, &lt;code&gt;&amp;gt;&lt;/code&gt; list lines, &lt;code&gt;[ ]&lt;/code&gt; links) because the product is monitoring for technical buyers, not a lifestyle brand. Hero clutter is banned explicitly: brand, one headline, one supporting sentence, one button or form group, one product visual. When we leave those &lt;em&gt;why&lt;/em&gt; lines out, agents reintroduce cream backgrounds with serif headlines or purple mesh backgrounds we already ruled out in writing.&lt;/p&gt;
&lt;p&gt;Asking for rationale in the output (“this accent comes from reference B”) makes decorative noise easier to reject. Vague praise words (“make it premium”) invite the average back in. References without &lt;em&gt;why&lt;/em&gt; do the same: the model copies surface styling instead of the decision behind it.&lt;/p&gt;
&lt;h3 id=&quot;pass-two-describe-visitor-jobs-before-visual-direction&quot;&gt;Pass two: describe visitor jobs before visual direction&lt;/h3&gt;
&lt;p&gt;Three concrete jobs a visitor must complete in the first session work better than a mood board. On &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=your-site-looks-ai-generated-heres-how-to-fix-it&quot;&gt;apogeewatcher.com&lt;/a&gt; the first-session jobs we design for are roughly: run a free domain check, compare agency vs solo pricing, and start a trial. Feature cards and FAQ earn their place only after those jobs are clear. Colour, radius, and motion come after the outline, not before.&lt;/p&gt;
&lt;p&gt;When jobs come first, sections stop being filler. A pricing block earns its place because a job needs it, and a testimonial earns its place because a trust gap is real. Agents that start from “add social proof” invent filler; agents that start from jobs prune it.&lt;/p&gt;
&lt;p&gt;Generic monitoring mistakes match generic design mistakes here. Homepage-only URL lists and homepage-only design briefs both miss the pages that make money. If checkout or pricing is the job, that URL and that layout get attention first.&lt;/p&gt;
&lt;h3 id=&quot;pass-three-treat-the-agent-as-a-potential-customer-on-the-live-url&quot;&gt;Pass three: treat the agent as a potential customer on the live URL&lt;/h3&gt;
&lt;p&gt;After generate or revise, what matters is the &lt;strong&gt;deployed&lt;/strong&gt; URL (staging is fine; a Figma frame is not). The same agent (or a second one), with no prior context, trying to complete the visitor jobs, usually shows where people click, what confuses them, and what feels templated. Pasting that transcript into the ticket keeps the review grounded.&lt;/p&gt;
&lt;p&gt;Humans still walk the path once. Agents miss brand judgment and over-index on polish. In our nav work we have rejected “finished” buttons that looked correct alone and still felt wrong on the live page: for example a Start now control that needed a flat charcoal border once the hard drop shadow made it look floaty instead of sharp. The point of the pass is cheap friction discovery: dead ends, identical cards, hero copy that never names the product, and buttons that compete.&lt;/p&gt;
&lt;p&gt;While that URL is open, a glance at lab and field performance on the money pages belongs in the same review. A beautiful default that ships a multi-megabyte hero still costs conversion. We have written about why slow pages lose revenue and trust in &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/real-cost-poor-web-performance-data-driven-analysis?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=your-site-looks-ai-generated-heres-how-to-fix-it&quot;&gt;The Real Cost of Poor Web Performance&lt;/a&gt;. Design taste and performance budgets belong together.&lt;/p&gt;
&lt;h3 id=&quot;pass-four-run-an-accessibility-check-as-a-ux-pass&quot;&gt;Pass four: run an accessibility check as a UX pass&lt;/h3&gt;
&lt;p&gt;Many accessibility rules are taste and clarity wins, not only compliance. Heading order, landmarks, focus visibility, contrast, alt text that describes function, and forms that announce errors catch problems that a visual pass misses. Broken hierarchy is a common AI leftover: several visual “H1s” that are really styled divs, or an H2 that skips levels because the card grid looked balanced.&lt;/p&gt;
&lt;p&gt;On Watcher marketing pages the orange-on-charcoal contrast and visible focus rings are part of the same brief as the orange button colour. Agents that only “make it pop” often fail keyboard focus or invent decorative headings that never reach the accessibility tree. We map which accessibility fixes also move Core Web Vitals conversations in &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/accessibility-core-web-vitals?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=your-site-looks-ai-generated-heres-how-to-fix-it&quot;&gt;Accessibility and Core Web Vitals&lt;/a&gt;. For semantic heading discipline as craft, our Hashnode note on heading hierarchy as a non-negotiable (not a design trade-off) pairs with this pass. If you already audit the accessibility tree for AI search and agents, that output is reusable here: the tree is what assistive tech and many agents walk, and a green Lighthouse a11y score alone will not catch a decorative heading soup.&lt;/p&gt;
&lt;h3 id=&quot;what-this-ritual-will-not-do&quot;&gt;What this ritual will not do&lt;/h3&gt;
&lt;p&gt;It will not invent a brand system, illustration language, or motion design from nothing. Watcher’s Technical Brutalism existed as written design tokens before we asked agents to restyle pages; the steps above only keep generations inside that fence. It will not excuse skipping a designer when the client needs a durable visual identity. It will not fix a product that has no clear visitor job. It will remove the default look that makes stakeholders say “this looks AI-generated,” and it will catch the performance and accessibility debt that often ships with that look. That is enough for many landing pages and enough to brief a designer properly when the work is larger.&lt;/p&gt;
&lt;h3 id=&quot;ship-the-next-page-without-the-average&quot;&gt;Ship the next page without the average&lt;/h3&gt;
&lt;p&gt;A useful sequence is references-and-why brief, visitor jobs, generate, live URL as a stranger, then accessibility and performance glance before the presentation. AI stays useful as a drafter and a critic; humans decide taste and stay accountable for the result. Teams that look after many client domains usually pair these design checks with scheduled PageSpeed evidence so “it looks fine” and “it measures fine” are not separate Mondays. &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/sign-up?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=your-site-looks-ai-generated-heres-how-to-fix-it&quot;&gt;Start a Watcher trial&lt;/a&gt; when that evidence needs to span a portfolio.&lt;/p&gt;
&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/&quot;&gt;Apogee Watcher homepage&lt;/a&gt; (Technical Brutalism example)&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/accessibility-core-web-vitals&quot;&gt;Accessibility and Core Web Vitals&lt;/a&gt; (Apogee Watcher)&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/real-cost-poor-web-performance-data-driven-analysis&quot;&gt;The Real Cost of Poor Web Performance&lt;/a&gt; (Apogee Watcher)&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/alanwest/how-to-fix-the-ai-generated-look-in-your-frontend-1ahh&quot;&gt;How to fix the 'AI-generated' look in your frontend&lt;/a&gt; (Alan West / DEV)&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://uxplanet.org/how-to-spot-ai-generated-design-697aaabe76c8&quot;&gt;How to Spot AI-Generated Design&lt;/a&gt; (UX Planet)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Originally published on &lt;a rel=&quot;nofollow&quot; href=&quot;https://devlog.apogeewatcher.com/your-site-looks-ai-generated-heres-how-to-fix-it&quot;&gt;Hashnode&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/28583/your-site-looks-ai-generated-heres-how-to-fix-it</guid>
<pubDate>Fri, 25 Sep 2026 07:05:29 +0000</pubDate>
</item>
<item>
<title>Audit the accessibility tree, not only the Lighthouse a11y score</title>
<link>https://coderlegion.com/27040/audit-the-accessibility-tree-not-only-the-lighthouse-a11y-score</link>
<description>&lt;p&gt;Agents and screen readers share the same semantic layer. A green Accessibility category is not proof that money-page actions have roles, names, and landmarks machines can use.&lt;/p&gt;
&lt;p&gt;The accessibility tree is the structured layer the browser builds from the DOM: roles, names, and states that assistive technology has used for decades. Screen readers walk it. Playwright can snapshot it. Agentic browsing tools that refuse to read pixels lean on it as well. That is a different artefact from the Lighthouse Accessibility category score, which answers whether a fixed set of automated checks passed on one lab run. Teams that treat a green score as proof that AI agents or assistive technology can complete a purchase path are mixing two jobs.&lt;/p&gt;
&lt;p&gt;John McAlpin’s August 2026 Search Engine Land piece on &lt;a rel=&quot;nofollow&quot; href=&quot;https://searchengineland.com/accessibility-tree-seo-use-cases-484338&quot;&gt;SEO use cases for auditing the accessibility tree&lt;/a&gt; pushed the tree into SEO conversations because agents now consume the same layer. That framing is useful for account teams who already hear “AI search” in every pitch deck, but a feature rundown is not an ops playbook. Agency work still needs a shorter cut: what the tree is, why the Lighthouse score is not a substitute, and which audits belong on money pages and in continuous integration.&lt;/p&gt;
&lt;h3 id=&quot;what-the-accessibility-tree-exposes-roles-names-states-&quot;&gt;What the accessibility tree exposes (roles, names, states)&lt;/h3&gt;
&lt;p&gt;Browsers compute an accessibility tree from markup, styles that affect visibility, and ARIA. Each node that matters usually carries a role (button, link, heading, textbox), an accessible name (the label a stranger would hear or read), and state (expanded, disabled, checked). Chrome DevTools can show the full-page tree beside the DOM. Playwright’s &lt;a rel=&quot;nofollow&quot; href=&quot;https://playwright.dev/docs/aria-snapshots&quot;&gt;ARIA snapshots&lt;/a&gt; export a YAML view of the same structure for tests.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://apogeewatcher.com/blog-images/49-accessibility-tree-devtools.png&quot; alt=&quot;Chrome DevTools Accessibility tab with Show accessibility tree enabled, listing roles such as banner, navigation, and main instead of raw DOM tags&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Chrome DevTools Accessibility tab with “Show accessibility tree” on: roles and names replace the DOM view so you can see what assistive technology (and many agents) actually receive. Source: Chrome for Developers accessibility reference (captured 12 Sep 2026).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sighted users often infer structure from size and whitespace. Machines do not. A pricing call to action built as a clickable &lt;code&gt;div&lt;/code&gt; with no name may look perfect in a design review and still be absent or anonymous in the tree. That gap is what SEO and agent-readiness briefs are naming in 2026, and it is the same gap accessibility specialists have been filing for years.&lt;/p&gt;
&lt;h3 id=&quot;lighthouse-accessibility-score-versus-an-accessibility-tree-audit&quot;&gt;Lighthouse accessibility score versus an accessibility tree audit&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Question &lt;/th&gt;&lt;th&gt;Lighthouse Accessibility category &lt;/th&gt;&lt;th&gt;Accessibility tree audit&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;What does it answer? &lt;/td&gt;&lt;td&gt;Did a fixed set of automated checks pass on this lab load? &lt;/td&gt;&lt;td&gt;Can a reader of roles, names, and states complete the jobs on this URL?&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Typical output &lt;/td&gt;&lt;td&gt;Weighted 0–100 score plus failed audits &lt;/td&gt;&lt;td&gt;Pass/fail on CTAs, forms, landmarks, headings, image names&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Strength &lt;/td&gt;&lt;td&gt;Fast regression signal in CI and PageSpeed Insights &lt;/td&gt;&lt;td&gt;Catches unnamed controls and visual-only structure the score can miss&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Limit &lt;/td&gt;&lt;td&gt;Not a full WCAG audit; green is not “accessible” &lt;/td&gt;&lt;td&gt;Point-in-time unless you snapshot in CI&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Chrome documents how the &lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.chrome.com/docs/lighthouse/accessibility/scoring&quot;&gt;Lighthouse accessibility score&lt;/a&gt; is weighted, and that documentation is the authoritative entity for the score itself. Our operational point is narrower: keep running the score, and still open the tree on revenue URLs. A page can pass colour-contrast and label audits while the primary checkout button remains a nameless control, or while product copy that sells the offer only appears after client-side hydration that some agents never finish.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://apogeewatcher.com/blog-images/49-psi-lighthouse-accessibility-score.png&quot; alt=&quot;PageSpeed Insights desktop lab for apogeewatcher.com showing Lighthouse Accessibility 92 beside Performance, Best Practices, SEO, and Agentic Browsing&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PageSpeed Insights desktop lab for apogeewatcher.com (12 Sep 2026): Accessibility 92 is a useful regression signal, not proof that every money-page control has a clear role and name in the tree. Agentic Browsing sits beside it as a separate lane.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Accessibility work that also improves Core Web Vitals (keyboard latency, layout-stable focus) is a separate prioritisation problem. We cover that crosswalk in &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/accessibility-core-web-vitals?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hashnode-accessibility-tree-seo-ai-search&quot;&gt;Accessibility + Core Web Vitals&lt;/a&gt;. The tree audit below is about machine-legible structure, not whether Interaction to Next Paint moved on a dashboard.&lt;/p&gt;
&lt;h3 id=&quot;money-page-checklist-can-an-agent-act-from-the-tree-alone-&quot;&gt;Money-page checklist: can an agent act from the tree alone?&lt;/h3&gt;
&lt;p&gt;A workable seed set is usually ten to twenty URLs ranked by revenue or conversions, not by homepage vanity. Homepage-only samples miss the templates where unnamed calls to action actually sit. For each URL, the useful capture is the tree itself (DevTools full-page view, or a headless export), then a short pass/fail score against:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Primary call to action exposed as a button or link with a descriptive accessible name.&lt;/li&gt;
&lt;li&gt;Every form control has a programmatically associated label.&lt;/li&gt;
&lt;li&gt;Navigation sits in a navigation landmark; main content sits in a main landmark.&lt;/li&gt;
&lt;li&gt;Pricing, product details, and contact facts appear as readable text nodes, not only in images or canvas.&lt;/li&gt;
&lt;li&gt;Interactive state that users see (open accordion, enabled submit) updates in the tree (&lt;code&gt;aria-expanded&lt;/code&gt;, &lt;code&gt;disabled&lt;/code&gt;, and similar).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What good looks like: a stranger reading only roles and names could name the page’s jobs and complete them without guessing. Failures usually trace to &lt;code&gt;div&lt;/code&gt; click handlers, icon-only buttons without names, or inputs missing labels. Native HTML covers most controls; ARIA fits when native elements cannot express the widget.&lt;/p&gt;
&lt;p&gt;McAlpin frames this as an agent readiness audit. The same bar applies to assistive technology. If the tree lies about state, a screen reader user is misled with the same confidence an agent would be.&lt;/p&gt;
&lt;h3 id=&quot;javascript-rendering-gaps-the-accessibility-tree-makes-obvious&quot;&gt;JavaScript rendering gaps the accessibility tree makes obvious&lt;/h3&gt;
&lt;p&gt;Traditional rendering checks ask whether content appeared in the HTML or after hydration. The accessibility tree asks a sharper question: did substance reach the layer agents and assistive technology read, and when? Capture the tree before and after client-side JavaScript where your tooling allows a diff. Core headings, primary links, and product grids that exist only in the post-hydration tree are invisible to any consumer that does not fully execute your scripts. That pattern is familiar from crawler audits; the accessibility tree simply makes the missing nodes explicit. When the tree before hydration is empty of the jobs you sell, server-render or pre-render those money templates so substance is present before scripts finish.&lt;/p&gt;
&lt;h3 id=&quot;headings-landmarks-and-accessible-names-agents-actually-receive&quot;&gt;Headings, landmarks, and accessible names agents actually receive&lt;/h3&gt;
&lt;p&gt;Crawler exports report what sits in the HTML source. The accessibility tree reports what is consumed after roles and names resolve. Those views disagree more often than teams expect: visual headings that are styled &lt;code&gt;div&lt;/code&gt;s, &lt;code&gt;aria-label&lt;/code&gt; overrides that replace good anchor text with “Link”, and landmark-free pages where every block floats as generic content.&lt;/p&gt;
&lt;p&gt;For content templates, heading nodes pulled from the tree are the practical sequence check (one clear document title, no decorative skips). Meaningful blocks belong inside landmarks. For internal links, sorting link-role nodes by accessible name usually surfaces empty names first, then generic “Read more” clusters, then overrides that discard useful visible text. Semantic heading hierarchy as a design argument is covered separately in our Hashnode piece on &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.hashnode.dev/heading-hierarchy-semantic-html-not-design-tradeoff&quot;&gt;heading hierarchy and semantic HTML&lt;/a&gt;. Here the job is narrower: whether the tree matches the outline you intended to publish.&lt;/p&gt;
&lt;h3 id=&quot;put-aria-snapshots-in-ci-so-the-tree-cannot-silently-regress&quot;&gt;Put ARIA snapshots in CI so the tree cannot silently regress&lt;/h3&gt;
&lt;p&gt;Point-in-time audits go stale on the next component refactor. Playwright’s &lt;code&gt;toMatchAriaSnapshot&lt;/code&gt; (see the &lt;a rel=&quot;nofollow&quot; href=&quot;https://playwright.dev/docs/aria-snapshots&quot;&gt;ARIA snapshots documentation&lt;/a&gt;) commits a YAML baseline of a template’s tree and fails the build when a deploy strips a name, removes a landmark, or demotes a heading. Reviewers read a human-scale diff: a button that used to say “Complete purchase” and now says nothing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://apogeewatcher.com/blog-images/49-playwright-aria-snapshot.png&quot; alt=&quot;Playwright documentation for ARIA snapshot testing showing toMatchAriaSnapshot with a YAML tree of banner, heading, and named links&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Playwright’s ARIA snapshot assertion: a YAML view of roles and names you can commit and diff in CI, so the accessibility tree cannot regress silently on the next redesign (docs captured 12 Sep 2026).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That check earns its keep on homepage, product, and checkout templates (or your equivalents). Snapshot updates belong with intentional redesigns; unexpected diffs work best as release blockers the same way broken redirects already do. That is how accessibility tree SEO work survives sprint pressure instead of living only in a quarterly PDF.&lt;/p&gt;
&lt;h3 id=&quot;where-webmcp-and-agentic-browsing-monitoring-sit-beside-the-tree&quot;&gt;Where WebMCP and agentic browsing monitoring sit beside the tree&lt;/h3&gt;
&lt;p&gt;A clean accessibility tree helps agents that still scrape structure. WebMCP and related page tools aim to expose actions explicitly so agents do not have to guess from DOM noise. Chrome’s experimental Lighthouse Agentic Browsing lane scores fractional readiness across accessibility-for-agents, WebMCP, layout stability, and related checks rather than a second 0–100 Performance grade. We walk that scoring model in &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/lighthouse-agentic-browsing-scoring?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hashnode-accessibility-tree-seo-ai-search&quot;&gt;Lighthouse Agentic Browsing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In agency practice, unnamed controls and landmarks on money paths come first; WebMCP belongs where you need reliable agent transactions; scheduled lab monitoring catches regressions on the URLs that matter. Citation dashboards and prompt trackers answer a different question again. Agencies that need a measurement split for “are we visible in ChatGPT?” can start from &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/ai-search-visibility-agencies-measure-first?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hashnode-accessibility-tree-seo-ai-search&quot;&gt;AI search visibility: what to measure first&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;faq&quot;&gt;FAQ&lt;/h3&gt;
&lt;h4 id=&quot;does-a-green-lighthouse-accessibility-score-mean-the-accessibility-tree-is-agent-ready-&quot;&gt;Does a green Lighthouse accessibility score mean the accessibility tree is agent-ready?&lt;/h4&gt;
&lt;p&gt;No. The score summarises automated checks on one lab visit, which is useful for catching regressions quickly. An accessibility tree audit asks whether roles, names, and states on this URL support the jobs you care about: buy, enquire, sign up, compare plans. Both signals stay useful: the score for continuous integration speed, and the tree when a client asks whether agents or assistive technology can finish buy, enquire, or sign-up on this URL.&lt;/p&gt;
&lt;h4 id=&quot;is-accessibility-tree-seo-a-replacement-for-wcag-work-&quot;&gt;Is accessibility tree SEO a replacement for WCAG work?&lt;/h4&gt;
&lt;p&gt;No. The tree exists so people using assistive technology can use the web. SEO and agent readiness are side effects of doing that correctly, not a reason to add ARIA only for citation chase. Sloppy ARIA written only for “AI optimisation” can actively harm screen reader users who have no visual cue that the tree is lying. Certified specialists fit when the site is large, regulated, or already under legal review.&lt;/p&gt;
&lt;h4 id=&quot;where-should-agencies-start-this-week-&quot;&gt;Where should agencies start this week?&lt;/h4&gt;
&lt;p&gt;The highest return per hour is usually the five-item checklist on the top ten revenue URLs, with tickets filed for unnamed calls to action and missing landmarks before the backlog grows. After those fixes ship, ARIA snapshot tests on the same templates keep the next redesign from undoing structure quietly. Tree diffs belong in migration QA the same way redirect checks already do.&lt;/p&gt;
&lt;h3 id=&quot;cta&quot;&gt;CTA&lt;/h3&gt;
&lt;p&gt;A useful first check is the full-page accessibility tree in DevTools on one money URL. When the primary action has no clear name, that ticket usually outranks the Lighthouse Accessibility number on the same page. For multi-site teams, scheduled PageSpeed Insights and Lighthouse history on those URLs keep structure fixes and performance regressions in one reporting rhythm rather than a one-off audit folder.&lt;/p&gt;
&lt;h3 id=&quot;references-1&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://searchengineland.com/accessibility-tree-seo-use-cases-484338&quot;&gt;10 SEO use cases for auditing your accessibility tree for AI search&lt;/a&gt; (John McAlpin, Search Engine Land)&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.chrome.com/docs/lighthouse/accessibility/scoring&quot;&gt;Lighthouse accessibility score&lt;/a&gt; (Chrome for Developers)&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.chrome.com/docs/lighthouse/agentic-browsing/accessibility-for-agents&quot;&gt;Accessibility for agents&lt;/a&gt; (Chrome for Developers)&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://playwright.dev/docs/aria-snapshots&quot;&gt;ARIA snapshots&lt;/a&gt; (Playwright)&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/accessibility-core-web-vitals&quot;&gt;Accessibility + Core Web Vitals: the overlooked UX wins&lt;/a&gt; (Apogee Watcher)&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/lighthouse-agentic-browsing-scoring&quot;&gt;Lighthouse Agentic Browsing: How to rank in chatbots&lt;/a&gt; (Apogee Watcher)&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/ai-search-visibility-agencies-measure-first&quot;&gt;Are We Visible in ChatGPT? What Agencies Can Measure First&lt;/a&gt; (Apogee Watcher)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Originally published on &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.hashnode.dev/accessibility-tree-seo-ai-search&quot;&gt;Hashnode&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27040/audit-the-accessibility-tree-not-only-the-lighthouse-a11y-score</guid>
<pubDate>Sun, 13 Sep 2026 07:35:04 +0000</pubDate>
</item>
<item>
<title>The Story Behind Accesstive: Web Accessibility. Done Right.</title>
<link>https://coderlegion.com/26586/the-story-behind-accesstive-web-accessibility-done-right</link>
<description>&lt;p&gt;It's more than our tagline. It's the reason Accesstive exists.&lt;br&gt;
And it's why we're telling you this before talking about our product.&lt;br&gt;
In 2025 alone, 8,667 ADA web accessibility lawsuits were filed in the United States, a 37% increase year over year. Across Europe, the European Accessibility Act (EAA) is now in force, and organizations that fail to meet accessibility requirements can face significant financial penalties and legal risk.&lt;br&gt;
Most organizations don't discover they have an accessibility problem until they receive a complaint, lose a customer, or are asked to prove compliance.&lt;br&gt;
We believe that shouldn't be the case.&lt;br&gt;
That's one of the reasons we built Accesstive and why we made our Free Accessibility Checker available to everyone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What Most Accessibility Tools Get Wrong&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Search for &quot;accessibility checker&quot; and you'll find hundreds of scanners, overlays, and widgets promising quick fixes or instant compliance.&lt;br&gt;
The reality is different.&lt;br&gt;
An automated scan can identify many accessibility issues, but it cannot evaluate everything. Likewise, a widget alone doesn't make a website compliant or accessible for every user. Accessibility requires continuous attention, thoughtful remediation, and, in many cases, human expertise.&lt;br&gt;
The challenge isn't finding another scanner.&lt;br&gt;
The challenge is knowing what matters, fixing issues correctly, tracking progress over time, and having the documentation to demonstrate the work that's been done.&lt;br&gt;
That's where many organizations struggle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why We Built Accesstive&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For more than 15 years, we've been building enterprise websites and digital experiences for organizations across industries. Throughout that journey, one challenge kept repeating itself: web accessibility.&lt;br&gt;
The problem wasn't a lack of accessibility tools. There were scanners, overlays, consultants, manual audits, and reporting tools. The real challenge was that they all worked separately. Agencies and in-house teams had to switch between multiple tools, track fixes in spreadsheets, coordinate audits, and maintain documentation on their own.&lt;br&gt;
We faced the same challenge while delivering websites for our clients.&lt;br&gt;
So we built an internal solution to simplify the process. It helped our team monitor accessibility, manage issues, track remediation, and keep everything in one workflow. It wasn't created as a product. It was built to solve a real problem we experienced every day.&lt;br&gt;
As more clients started facing the same challenges, we realized this wasn't unique to us. It was a problem shared by agencies, developers, businesses, and public sector organizations around the world.&lt;br&gt;
That's how Accesstive was born.&lt;br&gt;
We didn't build another accessibility scanner.&lt;br&gt;
We didn't build another overlay.&lt;br&gt;
We built a Continuous Accessibility Platform that helps web teams find issues, understand them, fix them, monitor progress, and document everything in one place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More Than a Free Accessibility Checker&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For organizations taking their first step, we created the Free Accessibility Checker.&lt;br&gt;
It goes far beyond a traditional automated scan.&lt;br&gt;
In seconds, you can scan any public website, launch a Live Audit that highlights accessibility issues directly on the webpage, review findings against relevant WCAG success criteria, explore AI-powered remediation guidance, and download a detailed accessibility report.&lt;br&gt;
The goal isn't just to generate another list of issues.&lt;br&gt;
It's to help teams understand what needs attention, why it matters, and how to move forward with confidence.&lt;br&gt;
AI When It Helps. Human Experts When It Matters.&lt;br&gt;
We believe automation should support accessibility, not replace expertise.&lt;br&gt;
That's why every organization can book a free first consultation with one of our accessibility experts.&lt;br&gt;
Whether you need help interpreting your scan results, prioritizing remediation, validating complex accessibility issues, or planning your compliance journey, our specialists are available to guide you.&lt;br&gt;
AI helps you move faster.&lt;br&gt;
Human expertise helps you make the right decisions.&lt;br&gt;
We believe organizations need both.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accessibility Is Never &quot;Done&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Websites evolve. Content changes. New features are released. Regulations continue to evolve.&lt;br&gt;
Accessibility should evolve with them.&lt;br&gt;
That's why Accesstive is built around continuous accessibility instead of one-time scans or one-off compliance projects. Our goal is to help organizations make accessibility part of their everyday web operations, not something they only think about after receiving a legal notice.&lt;br&gt;
Our mission is simple: Help every web team Find, Fix &amp;amp; Prove accessibility with confidence. &lt;br&gt;
Help agencies, developers, businesses, and public sector organizations avoid the fragmented accessibility journey we experienced for years.&lt;br&gt;
Because Web Accessibility. Done Right. isn't just our tagline.&lt;br&gt;
It's the standard we're committed to helping every web team achieve.&lt;br&gt;
Learn more about Accesstive or run a free accessibility scan at &lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://accesstive.com/free-accessibility-checker/&quot;&gt;https://accesstive.com/free-accessibility-checker/&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/26586/the-story-behind-accesstive-web-accessibility-done-right</guid>
<pubDate>Wed, 09 Sep 2026 10:00:35 +0000</pubDate>
</item>
<item>
<title>The Full Circle Philosophy Behind py-simple-wrap</title>
<link>https://coderlegion.com/26482/the-full-circle-philosophy-behind-py-simple-wrap</link>
<description>&lt;p&gt;&lt;strong&gt;Full circle philosophy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Py-simple-wrap is an &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/sara-czasak/py-simple-wrap&quot;&gt;open source&lt;/a&gt; project which I built. It is a &lt;a rel=&quot;nofollow&quot; href=&quot;https://pypi.org/project/py-simple-wrap/&quot;&gt;python package&lt;/a&gt; that is meant both to make python easier for beginners to use by reducing boilerplate code down to 1-2 lines.&lt;/p&gt;
&lt;p&gt;Although not something that I expected, when the first contributors started appearing, I pivoted to make the project easy to contribute to as well. I realize how overwhelming contributing can be so I decided to make the process as easy and stress free as possible to empower first time contributors to start their open source journey.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Background/Constraints&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before I get too far in rambling on about py-simple-wrap let me give you some background.&lt;/p&gt;
&lt;p&gt;I think back not that long ago to when I first typed &lt;code&gt;print(&quot;Hello, world!&quot;)&lt;/code&gt; on phone (yes, I started learning python on a Samsung phone using the pydroid3 app). After I typed that line I was hooked, but there were times when I almost gave up. One thing that almost made me quit is my dyslexia, small typos are insignificant anywhere else but are the &lt;code&gt;make it or break it&lt;/code&gt; factor in a codebase. Had I given up it would have been a huge loss I wouldn't even be aware of. That's why py-simple-wrap puts such strong focus on clear function names and clear parameter names along with clear docstrings with examples.&lt;/p&gt;
&lt;p&gt;I started working with python about a year and a half ago - not a whole lot in the grand scheme of things.&lt;/p&gt;
&lt;p&gt;On top of that py-simple-wrap is my second ever package (I integrated my first ever package date-formatter-spcm into py-simple-wrap), with the first one being a tiny project. The first package was a much more simple version of the easy_formatter module. I also had no prior project management experience.&lt;/p&gt;
&lt;p&gt;If that's not enough right there let me add that I also work full time as a hotel restaurant waitress, which means my time is very limited. Nevertheless, most of the time I'm not waiting tables, I'm working on some aspect of py-simple-wrap.&lt;/p&gt;
&lt;p&gt;All of the mentioned above means that I’m also learning as I build, maintain, review code, etc. Is it challanging? Yes, for sure! Is it worth it? Without a doubt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What about contributing?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Well, I don't have that much experience contributing either. What I do have is plenty of experience in how stressful contributing can be and how daunting that first PR is. I have anxiety. And said anxiety made me feel like a bad PR would be the end of the world, I worried I would look like a fool or a joke to other devs and like one bad PR could break someone's code (and mind you I do know that PRs can't just break someone's code).&lt;/p&gt;
&lt;p&gt;I finally made my first PR in June of this year. I was lucky enough to volunteer at EuroPython 2026, and during the sprints I finally made my first couple of contributions — and saw my first ever merged PR happen right there in person. What made that possible was being right next to the Napari maintainers while it happened. They were warm, supportive, and helpful, with good humor and a fun, light atmosphere that made a nerve-wracking first PR feel like a lot less of a big deal. Huge shout out to the Napari team! I'm trying to bring that same atmosphere to py-simple-wrap contributions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unexpected growth&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When I first started working on py-simple-wrap I didn't expect it to grow much. But now, within the first month and a half, we have a community of 40+ contributors, 20+ stars, 40+ forks, and I built that with zero prior project management experience. I'm proud of that. &lt;/p&gt;
&lt;p&gt;I’m learning as I do, I keep trying to improve and do better. It’s turning out to be a wonderful, wild and wonderfully wild adventure! &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contributors Quest&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As I mentioned, the amount of contributions took me by surprise, but I also realized the project being seen is a great opportunity to make yet another area more approachable. I realize all the stress and anxiety often involved in making a first PR, I also realize how important contributing to open source is, and how much of a joy it can be to build as a community (big or small).&lt;/p&gt;
&lt;p&gt;I managed to work out a few ways to make contributing as easy as I can (and I’m still looking for more ways). I make sure there are always first-contributor, good-first-issue &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/sara-czasak/py-simple-wrap/issues&quot;&gt;issues&lt;/a&gt; for a variety of contribution types (from docs, through tests, to working on a module), if changes on a PR are requested I try to make sure the contributor knows they can reach out for help. There is also a small (but growing) library of &lt;a rel=&quot;nofollow&quot; href=&quot;https://sara-czasak.github.io/py-simple-wrap/docs/contributor-hub/&quot;&gt;contributing tutorials&lt;/a&gt; including templates (for example docstring template), all of this is in an effort to make contributing more accessible and less scary. &lt;/p&gt;
&lt;p&gt;Another thing I added is &lt;a rel=&quot;nofollow&quot; href=&quot;https://sara-czasak.github.io/py-simple-wrap/quest/&quot;&gt;contributors quest&lt;/a&gt;, a gamified, RPG style game for the contributors with the ability to view the leaderboard, join a guild (or two, or three, for instance: 🪄 The Module Magicians' Guild, 🛡️ The Test Sentinels' Order, or 📜 The Lore Keepers' Circle), take part in challenges and more. I will admit that this particular element (contributors quest) was vibe coded in another project. I hope this small addition brings a little extra spark of fun for everyone!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI leveraged workflows&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With a few hours (1h–3h) on work days and up to 8h on days off, I needed a way to make the most of limited time and limited energy.&lt;/p&gt;
&lt;p&gt;I'm not the biggest fan of using AI to write code — I mostly use it as a tool to help me learn, not to hand off the actual logic. But automation is a different story, so I decided to leverage it there. I used Claude and Claude Code to build workflows that handle the tasks that don't need to be done by hand.&lt;/p&gt;
&lt;p&gt;Some of the most time-saving automations I implemented are: one that opens new issues based on modules missing tests, docs, etc., another that helps with releasing new versions to PyPI, and more. Thanks to this I was able to maximize the time I spent reviewing code, merging PRs, and of course coding!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The py-simple-wrap hope&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This project has already grown to unexpected proportions, and my single biggest hope is that it grows to become not only a package that simplifies python for beginners but also a full circle of learners learning together and helping others. &lt;/p&gt;
&lt;p&gt;When I close my eyes and imagine what I want py-simple-wrap to be I imagine this: a project with an active community that is kind and supportive, composed of python learners of all levels growing together and helping new contributors join the team and learn and grow. A full circle where newcomers can learn that contributing can be empowering, fun and exciting, and new Pythonistas get the chance to make bigger projects that make them want to understand python even more in depth.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/26482/the-full-circle-philosophy-behind-py-simple-wrap</guid>
<pubDate>Tue, 08 Sep 2026 11:45:15 +0000</pubDate>
</item>
<item>
<title>Heading hierarchy is not a design trade-off</title>
<link>https://coderlegion.com/23742/heading-hierarchy-is-not-a-design-trade-off</link>
<description>&lt;p&gt;Headings define structure and meaning, not typography. One H1, logical H2s and H3s, CSS for the visual layer: better SEO, accessibility, and clearer signals for search and LLMs.&lt;/p&gt;
&lt;p&gt;The design review opens on a landing page that looks clean. The hero line is an &lt;code&gt;h3&lt;/code&gt; because the brand type scale already used the largest size on a label above it. The pricing table jumps from &lt;code&gt;h2&lt;/code&gt; to &lt;code&gt;h4&lt;/code&gt; so the section titles sit closer to the cards. Nobody changed the copy. They changed what the document claims about itself. When SEO or accessibility pushes back, the answer is often some version of “we can’t sacrifice the layout.” That is the wrong frame. Heading hierarchy is not a design trade-off. CSS controls how headings look. HTML controls what they mean.&lt;/p&gt;
&lt;h3 id=&quot;what-heading-hierarchy-means-in-html-and-what-it-is-not-&quot;&gt;What heading hierarchy means in HTML (and what it is not)&lt;/h3&gt;
&lt;p&gt;In HTML, &lt;code&gt;h1&lt;/code&gt; through &lt;code&gt;h6&lt;/code&gt; are structural markers. They tell browsers, assistive technology, search crawlers, and downstream tools what the outline of the page is: title, major sections, subsections. Typography is a separate job. You can make an &lt;code&gt;h2&lt;/code&gt; look like a whisper and an &lt;code&gt;h4&lt;/code&gt; look like a billboard if the stylesheet says so. What you should not do is pick heading levels to match font size. That confuses every consumer that reads the DOM for structure, not computed style.&lt;/p&gt;
&lt;p&gt;A healthy page usually has one &lt;code&gt;h1&lt;/code&gt; that names the document, then &lt;code&gt;h2&lt;/code&gt; elements for the main sections a reader would skim, then &lt;code&gt;h3&lt;/code&gt; (and occasionally &lt;code&gt;h4&lt;/code&gt;) for subsections under each &lt;code&gt;h2&lt;/code&gt;. Skipping levels (&lt;code&gt;h2&lt;/code&gt; straight to &lt;code&gt;h4&lt;/code&gt;) or using multiple &lt;code&gt;h1&lt;/code&gt; elements because “each block is important” breaks the outline. The page can still win a screenshot review. It fails the structural one.&lt;/p&gt;
&lt;h3 id=&quot;why-teams-treat-headings-as-a-visual-problem&quot;&gt;Why teams treat headings as a visual problem&lt;/h3&gt;
&lt;p&gt;The habit is understandable. Design systems ship type ramps first. Components arrive with a “title” slot that maps to whatever size looks right in Figma. Marketing pastes a new hero and keeps the existing class names. A/B tests swap modules without anyone checking whether the outline still makes sense. By the time the page ships, the heading map is a record of layout decisions, not content hierarchy.&lt;/p&gt;
&lt;p&gt;That drift is easy to miss because most sighted users infer structure from size, weight, and whitespace. Screen reader users get a list of headings in level order. Crawlers and summarisers often weight headings heavily when they guess what a page is about. LLM pipelines that extract “sections” from HTML follow the tags, not the CSS. When visual hierarchy and document hierarchy diverge, you are asking non-visual readers to reverse-engineer your design choices.&lt;/p&gt;
&lt;h3 id=&quot;how-broken-heading-levels-hurt-seo-and-internal-linking&quot;&gt;How broken heading levels hurt SEO and internal linking&lt;/h3&gt;
&lt;p&gt;Search engines still use headings as one signal among many, not as a magic lever. They do help parsers understand which blocks belong together, which questions a page answers, and which phrases are section titles rather than body copy. A pricing page whose only &lt;code&gt;h2&lt;/code&gt; is buried under three decorative &lt;code&gt;h4&lt;/code&gt; labels makes the commercial intent harder to read. A service page that restarts at &lt;code&gt;h1&lt;/code&gt; in every component looks like several unrelated documents stitched together.&lt;/p&gt;
&lt;p&gt;The damage is often local rather than site-wide: one template with inverted levels can underperform on long-tail queries that match subsection titles you hid inside paragraph styling. That is a different problem from Core Web Vitals scores on the same URL, and a different fix from the metric work we covered when asking &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.hashnode.dev/accessibility-fixes-show-up-in-cwv-dashboards?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hashnode-heading-hierarchy-semantic-html&quot;&gt;which accessibility fixes show up in CWV dashboards&lt;/a&gt;. Headings are document semantics. CWV dashboards tell you whether interaction latency and layout stability are hurting real users. Both matter; neither substitutes for the other.&lt;/p&gt;
&lt;p&gt;For the broader SEO picture on why performance and experience signals sit beside content quality, see &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/how-core-web-vitals-impact-seo-rankings-what-the-data-shows?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hashnode-heading-hierarchy-semantic-html&quot;&gt;How Core Web Vitals impact SEO rankings: what the data shows&lt;/a&gt; on our Watcher blog. Use that guide when a client asks whether fixing LCP is enough; use heading audits when they ask why a well-written section never ranks for its title phrase.&lt;/p&gt;
&lt;h3 id=&quot;what-screen-readers-do-when-you-skip-from-h2-to-h4&quot;&gt;What screen readers do when you skip from H2 to H4&lt;/h3&gt;
&lt;p&gt;Assistive technology exposes headings as a navigable outline. A keyboard user can jump from section to section without reading every line between. When levels skip, the outline lies about nesting: an &lt;code&gt;h4&lt;/code&gt; after an &lt;code&gt;h2&lt;/code&gt; implies a missing &lt;code&gt;h3&lt;/code&gt; parent that is not in the document. Some users still work through the page linearly, but the quick-navigation feature becomes unreliable. Others lose confidence that the heading list matches the visual layout they cannot see.&lt;/p&gt;
&lt;p&gt;The overlap with performance work is real. Focus jumps, late-loading banners, and unstable layout hurt keyboard users and show up in CWV. Semantic headings do not fix INP or CLS on their own. They do stop you from shipping a page that is painful to navigate for reasons that never appear in a Lighthouse performance score. Our Watcher guide on &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/accessibility-core-web-vitals?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hashnode-heading-hierarchy-semantic-html&quot;&gt;accessibility and Core Web Vitals&lt;/a&gt; goes deeper on INP with keyboard input, focus-visible requirements, and CLS from focus management. Treat heading fixes as part of the same accessibility habit, not as a separate “SEO ticket.”&lt;/p&gt;
&lt;h3 id=&quot;why-llms-and-answer-engines-read-headings-differently-than-css&quot;&gt;Why LLMs and answer engines read headings differently than CSS&lt;/h3&gt;
&lt;p&gt;Models and retrieval tools that ingest HTML often chunk content by heading boundaries. If your true section title is a styled &lt;code&gt;p&lt;/code&gt; and the nearby &lt;code&gt;h3&lt;/code&gt; is only a kicker label, summaries attach the wrong label to the paragraph block. FAQ modules that mark every question as &lt;code&gt;h2&lt;/code&gt; flatten a page into a list of peer topics with no parent section. Comparison tables that promote each column header to &lt;code&gt;h3&lt;/code&gt; create phantom sections that never appear in the visible layout.&lt;/p&gt;
&lt;p&gt;Agencies are already being asked whether pages are “visible in ChatGPT” and similar systems. That question is partly about crawl policy, partly about content quality, and partly about whether machines can parse what humans see. Broken heading hierarchy is a quiet failure mode: the prose is fine, the design is fine, the outline is nonsense. For a measurement-first view of AI search visibility, see &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/ai-search-visibility-agencies-measure-first?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hashnode-heading-hierarchy-semantic-html&quot;&gt;Are we visible in ChatGPT? What agencies can measure first&lt;/a&gt;. Fix headings before you chase new schema types for the same page.&lt;/p&gt;
&lt;h3 id=&quot;how-to-keep-one-h1-and-logical-h2-h3-without-flattening-the-design&quot;&gt;How to keep one H1 and logical H2/H3 without flattening the design&lt;/h3&gt;
&lt;p&gt;Separate the two layers in code review. Content authors (or the CMS) own the outline: one &lt;code&gt;h1&lt;/code&gt;, ordered sections, no skipped levels without a deliberate subsection. Design owns the presentation: font size, weight, spacing, colour, and responsive behaviour via classes or design tokens. If the hero needs a small kicker above the main title, use a &lt;code&gt;p&lt;/code&gt; or &lt;code&gt;span&lt;/code&gt; with a kicker class, not an &lt;code&gt;h1&lt;/code&gt; or &lt;code&gt;h2&lt;/code&gt; chosen for size. If a card title should look large but sit under a section &lt;code&gt;h2&lt;/code&gt;, use &lt;code&gt;h3&lt;/code&gt; inside the card and style it to match the comp.&lt;/p&gt;
&lt;p&gt;Practical rules we use on client templates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Map Figma text styles to CSS classes, not to heading levels.&lt;/li&gt;
&lt;li&gt;Ban “heading level” as a prop on generic layout components unless the component is actually a section title.&lt;/li&gt;
&lt;li&gt;Run an outline check in CI or pre-publish QA: export heading levels in order and read them without the stylesheet.&lt;/li&gt;
&lt;li&gt;When you refactor, fix the HTML first, then adjust CSS. Never the reverse.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You do not need ugly pages. You need honest pages: the DOM outline should match the story a competent reader would tell from the layout. When design and semantics disagree, the stylesheet is the right place to compromise, not the heading level.&lt;/p&gt;
&lt;h3 id=&quot;how-to-audit-heading-structure-on-a-client-template-before-the-next-deploy&quot;&gt;How to audit heading structure on a client template before the next deploy&lt;/h3&gt;
&lt;p&gt;Open the page, disable author styles or use the accessibility tree, and list headings in level order. Read only that list aloud. If it sounds like nonsense, the template is not ready. Compare the list to the sitemap intent: does each &lt;code&gt;h2&lt;/code&gt; name a section a client would put in a report slide? Do &lt;code&gt;h3&lt;/code&gt; elements belong to the &lt;code&gt;h2&lt;/code&gt; above them, or did a carousel inject stray levels?&lt;/p&gt;
&lt;p&gt;Pick one high-traffic template (homepage, pricing, core service) and one long-form article layout. Fix those two before you normalise every blog component. Pair the heading pass with the accessibility and CWV checks you already schedule: keyboard tab through the same URLs, note focus surprises, and keep monitoring LCP, INP, and CLS in Apogee Watcher so semantic fixes do not get credited while regressions slip in elsewhere. On Monday, send the design lead the heading list without CSS and ask one question: “If you could not see the page, would this outline still be the story we want?” When the answer is no, reach for the stylesheet, not a lower heading level.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Originally published on &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.hashnode.dev/heading-hierarchy-semantic-html-not-design-tradeoff&quot;&gt;Hashnode&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/23742/heading-hierarchy-is-not-a-design-trade-off</guid>
<pubDate>Wed, 29 Jul 2026 13:58:07 +0000</pubDate>
</item>
<item>
<title>Which accessibility fixes show up in Core Web Vitals dashboards?</title>
<link>https://coderlegion.com/22039/which-accessibility-fixes-show-up-in-core-web-vitals-dashboards</link>
<description>&lt;p&gt;Alt text and ARIA labels rarely move a chart. Focus rings, keyboard latency, and layout-stable modals often do. Here is how we prioritise fixes agencies can prove in monitoring.&lt;/p&gt;
&lt;p&gt;The client closed the accessibility audit with a green checklist and a flat Core Web Vitals chart. Engineering fixed missing labels, colour contrast on three components, and a landmark order issue that never touched Largest Contentful Paint, Interaction to Next Paint, or Cumulative Layout Shift. Two sprints later, keyboard users still complained about laggy menus, and field INP on the account page had drifted from &quot;Good&quot; to &quot;Needs improvement&quot; without anyone naming an accessibility ticket in the regression notes.&lt;/p&gt;
&lt;p&gt;That split is routine. Accessibility work and Core Web Vitals monitoring answer different questions unless you choose fixes that move both. Some improvements are essential for compliance and never appear on a PageSpeed or CrUX dashboard. Others, especially around keyboard responsiveness and layout-stable focus, show up in the same charts executives already read. Agencies need both lists, not a single backlog sorted only by audit severity.&lt;/p&gt;
&lt;h3 id=&quot;why-do-accessibility-audits-and-core-web-vitals-dashboards-tell-different-stories-&quot;&gt;Why do accessibility audits and Core Web Vitals dashboards tell different stories?&lt;/h3&gt;
&lt;p&gt;Accessibility audits score conformance: labels, contrast, operable controls, predictable focus order. Core Web Vitals dashboards score field or lab timing on three metrics Google uses for page experience: LCP for loading, INP for responsiveness after load, CLS for layout stability during the session.&lt;/p&gt;
&lt;p&gt;A perfect audit can leave INP poor if main-thread JavaScript still blocks &lt;code&gt;keydown&lt;/code&gt; handlers. A green LCP on a hero image can still mean a screen reader waits on an empty shell until hydration finishes. The teams celebrate different wins because the instruments measure different surfaces.&lt;/p&gt;
&lt;p&gt;We use a simple sorting question after every audit export: will this fix change LCP, INP, or CLS on the URLs we monitor on a schedule? If yes, it goes on the performance board with a before-and-after run. If no, it stays on the accessibility board with its own verification. Both boards matter; merging them without criteria produces either ignored audit items or ignored chart regressions.&lt;/p&gt;
&lt;h3 id=&quot;which-keyboard-and-interaction-fixes-move-inp-on-monitoring-dashboards-&quot;&gt;Which keyboard and interaction fixes move INP on monitoring dashboards?&lt;/h3&gt;
&lt;p&gt;INP replaced First Input Delay because real sessions include many interactions, not only the first tap. Keyboard navigation generates a stream of small events: Tab to move focus, Enter to activate, typing into fields, opening menus. Heavy main-thread work delays the paint that follows each step, and that delay is what INP captures.&lt;/p&gt;
&lt;p&gt;Fixes we have seen move INP on monitored URLs without waiting for the next quarterly audit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Breaking up long tasks so focus and typing get a turn on the main thread.&lt;/li&gt;
&lt;li&gt;Deferring non-critical JavaScript so the page responds to keyboard input before analytics and personalisation finish loading.&lt;/li&gt;
&lt;li&gt;Replacing synchronous validation on every &lt;code&gt;input&lt;/code&gt; event with debounced or idle-time checks.&lt;/li&gt;
&lt;li&gt;Fixing custom components that attach expensive handlers to &lt;code&gt;keydown&lt;/code&gt; for global shortcuts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pointer-only testing hides most of this. A 200 ms delay after a click can feel acceptable once; the same delay after every Tab keypress feels broken because it repeats across the whole flow. If your monitoring tool stores only aggregate INP, add lab runs that walk a keyboard path through checkout or account settings after deploys that touch interaction code.&lt;/p&gt;
&lt;p&gt;Our longer write-up on &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/accessibility-core-web-vitals?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hashnode-accessibility-fixes-cwv-dashboards&quot;&gt;accessibility and Core Web Vitals&lt;/a&gt; goes deeper on keyboard paths, Event Timing metadata, and INP segmentation. For metric definitions and thresholds, start with &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/what-are-core-web-vitals-a-practical-guide-for-2026?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hashnode-accessibility-fixes-cwv-dashboards&quot;&gt;what Core Web Vitals measure in 2026&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;which-focus-and-layout-fixes-show-up-as-cls-improvements-&quot;&gt;Which focus and layout fixes show up as CLS improvements?&lt;/h3&gt;
&lt;p&gt;CLS is often explained with late-loading ads and images without dimensions. Focus management contributes too, and those shifts punish keyboard and screen reader users first.&lt;/p&gt;
&lt;h4 id=&quot;focus-rings-that-change-layout-on-focus&quot;&gt;Focus rings that change layout on &lt;code&gt;:focus&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;WCAG requires a visible focus indicator. Teams sometimes add a border or extra padding only on focus to make the ring obvious. That changes element size and can register as layout shift, especially on dense navigation bars where many items receive focus in sequence.&lt;/p&gt;
&lt;p&gt;Switching to &lt;code&gt;outline&lt;/code&gt; or &lt;code&gt;box-shadow&lt;/code&gt; for focus styles usually satisfies visibility without moving layout. We have watched CLS on template dashboards calm down after removing border-based focus treatments on header links, with no change to the hero LCP element.&lt;/p&gt;
&lt;h4 id=&quot;focus-moves-that-scroll-unstable-pages&quot;&gt;Focus moves that scroll unstable pages&lt;/h4&gt;
&lt;p&gt;When focus lands on an offscreen control, the browser scrolls it into view. If fonts, images, or banners are still settling, that scroll combines with shifts and disorients keyboard users. Fixing image dimensions, reserving space for ads, and stabilising cookie banners reduces CLS for everyone and makes focus navigation predictable.&lt;/p&gt;
&lt;p&gt;Monitoring tip: when CLS regresses, inspect shift attribution if your tool provides it. &quot;Focus-related&quot; jumps often trace to modals, sticky headers, or late-inserted consent UI rather than the product grid clients ask about first.&lt;/p&gt;
&lt;h3 id=&quot;which-accessibility-improvements-help-lcp-without-changing-the-hero-image-&quot;&gt;Which accessibility improvements help LCP without changing the hero image?&lt;/h3&gt;
&lt;p&gt;LCP is usually a large image or text block in the viewport. Accessibility work rarely swaps that element directly, but it can change when primary content is available to assistive technology, which correlates with perceived readiness.&lt;/p&gt;
&lt;p&gt;Fixes that sometimes improve LCP or its practical cousin &quot;time until main content is usable&quot;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Server-rendering the primary heading and key controls instead of waiting for client hydration.&lt;/li&gt;
&lt;li&gt;Removing skeleton screens that paint quickly but delay semantic content in the DOM.&lt;/li&gt;
&lt;li&gt;Ensuring font loading strategy does not block text LCP with invisible text periods that reflow after load.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are not substitutes for image optimisation. They align &quot;largest content&quot; with &quot;meaningful content&quot; so a green LCP score is not lying to non-visual users. Track LCP element type in lab runs when accessibility refactors touch rendering strategy, not only when marketing changes the hero asset.&lt;/p&gt;
&lt;h3 id=&quot;which-accessibility-fixes-never-appear-on-a-core-web-vitals-dashboard-&quot;&gt;Which accessibility fixes never appear on a Core Web Vitals dashboard?&lt;/h3&gt;
&lt;p&gt;Some work is non-negotiable and invisible to the three metrics. Plan for it explicitly so clients do not ask why the chart stayed flat after a two-week audit sprint.&lt;/p&gt;
&lt;p&gt;Examples that rarely move LCP, INP, or CLS on monitored URLs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accurate alternative text and accessible names on decorative versus informative images.&lt;/li&gt;
&lt;li&gt;Colour contrast on text that was already stable in layout.&lt;/li&gt;
&lt;li&gt;Correct heading hierarchy and landmark regions when DOM order was already fixed.&lt;/li&gt;
&lt;li&gt;Captions and transcripts for media (essential for access, unrelated to vitals timing).&lt;/li&gt;
&lt;li&gt;Error messages that were always present but poorly associated with fields (fix the association, not the paint timing).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That list is not an argument to deprioritise audit findings. It is an argument against using Core Web Vitals alone as proof of accessibility progress. Report audit closure and chart movement separately in client updates.&lt;/p&gt;
&lt;h3 id=&quot;how-should-agencies-monitor-accessibility-related-fixes-alongside-core-web-vitals-&quot;&gt;How should agencies monitor accessibility-related fixes alongside Core Web Vitals?&lt;/h3&gt;
&lt;p&gt;We keep scheduled PageSpeed-style runs on the templates named in the retainer, mobile and desktop where field data already splits. After any deploy tagged &quot;accessibility&quot; or &quot;interaction&quot;, we add one keyboard walk lab on the same URLs before the weekly report goes out.&lt;/p&gt;
&lt;p&gt;Practical monitoring habits:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Fix category &lt;/th&gt;&lt;th&gt;What to watch on dashboards &lt;/th&gt;&lt;th&gt;What to verify outside CWV&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Keyboard menus, modals, forms &lt;/td&gt;&lt;td&gt;INP on affected URLs; lab keyboard path after deploy &lt;/td&gt;&lt;td&gt;Focus trap behaviour, screen reader announcements&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Focus visible / focus order &lt;/td&gt;&lt;td&gt;CLS on nav-heavy templates &lt;/td&gt;&lt;td&gt;Manual tab order through loading states&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Rendering and hydration &lt;/td&gt;&lt;td&gt;LCP element type and value &lt;/td&gt;&lt;td&gt;Screen reader readout on first meaningful content&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Contrast, labels, landmarks &lt;/td&gt;&lt;td&gt;Usually flat on vitals charts &lt;/td&gt;&lt;td&gt;Audit retest or automated a11y scan&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Use the same URL groups you already report for Core Web Vitals. Adding a parallel &quot;accessibility URL list&quot; that only contains the homepage duplicates effort and hides regressions on account or checkout flows where keyboard latency actually hurts.&lt;/p&gt;
&lt;p&gt;Budget thresholds should match the performance policy document, not a second spreadsheet invented for the audit vendor. When INP or CLS crosses budget after an accessibility release, the regression owner is the team that shipped the interaction change, even if the original ticket said &quot;WCAG&quot;.&lt;/p&gt;
&lt;h3 id=&quot;next-step-tag-one-audit-fix-with-the-core-web-vital-it-should-move&quot;&gt;Next step: tag one audit fix with the Core Web Vital it should move&lt;/h3&gt;
&lt;p&gt;Open the last accessibility export for a live client. Pick three open items. For each, write which metric should change if the fix works: LCP, INP, CLS, or none. Put the metric-linked items on this week's deploy verification list with a scheduled lab run on the URLs where that metric is already charted.&lt;/p&gt;
&lt;p&gt;If every item lands in &quot;none&quot;, your monitoring scope is probably too narrow, not your audit. Expand templates on the watch list before you tell the sponsor that Core Web Vitals prove accessibility health.&lt;/p&gt;
&lt;p&gt;For the full crosswalk between assistive-tech UX and continuous monitoring, read &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/accessibility-core-web-vitals?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hashnode-accessibility-fixes-cwv-dashboards&quot;&gt;Accessibility and Core Web Vitals: the overlooked UX wins&lt;/a&gt;. For syllabus-level definitions of LCP, INP, and CLS, use &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.com/blog/what-are-core-web-vitals-a-practical-guide-for-2026?utm_source=hashnode&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hashnode-accessibility-fixes-cwv-dashboards&quot;&gt;What Are Core Web Vitals? A Practical Guide for 2026&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fixes that show up on dashboards earn a place in performance retainers. Fixes that do not still ship; they just need a different line on the report.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Originally published on &lt;a rel=&quot;nofollow&quot; href=&quot;https://apogeewatcher.hashnode.dev/accessibility-fixes-show-up-in-cwv-dashboards&quot;&gt;Hashnode&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/22039/which-accessibility-fixes-show-up-in-core-web-vitals-dashboards</guid>
<pubDate>Tue, 07 Jul 2026 10:55:24 +0000</pubDate>
</item>
<item>
<title>WCAG Color Contrast: What Developers Need to Know About Accessibility</title>
<link>https://coderlegion.com/19289/wcag-color-contrast-what-developers-need-to-know-about-accessibility</link>
<description>&lt;p&gt;Color contrast accessibility is one of the most commonly failed WCAG criteria — and one of the easiest to fix once you understand the rules. Here's what the standard requires and how to verify compliance.&lt;/p&gt;
&lt;h2&gt;What WCAG says&lt;/h2&gt;
&lt;p&gt;The Web Content Accessibility Guidelines (WCAG) define minimum contrast ratios between text and its background. The key requirements:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WCAG 2.1 Level AA (legal minimum in many jurisdictions):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Normal text (under 18pt regular or 14pt bold): &lt;strong&gt;4.5:1&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Large text (18pt+ regular or 14pt+ bold): &lt;strong&gt;3:1&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;UI components and graphical objects: &lt;strong&gt;3:1&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Decorative elements, logos, disabled controls: exempt&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
&lt;strong&gt;WCAG 2.1 Level AAA:&lt;/strong&gt;&lt;br&gt;
&lt;ul&gt;&lt;li&gt;Normal text: &lt;strong&gt;7:1&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Large text: &lt;strong&gt;4.5:1&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
&lt;strong&gt;Legal context:&lt;/strong&gt; WCAG 2.1 AA is legally required for public-sector websites in the EU (EN 301 549), the US (ADA and Section 508), Canada (AODA), and Australia (DDA). Private-sector websites are increasingly covered by ADA case law.
&lt;h2&gt;How contrast ratio is calculated&lt;/h2&gt;
&lt;p&gt;The contrast ratio is calculated from the relative luminance of the two colors:&lt;/p&gt;
&lt;p&gt;``&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;contrast ratio = (L1 + 0.05) / (L2 + 0.05)&lt;/p&gt;
&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Where L1 is the lighter color's relative luminance and L2 is the darker color's relative luminance. Relative luminance ranges from 0 (black) to 1 (white).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Relative luminance formula for sRGB:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;`&lt;code&gt;javascript&lt;br&gt;
function relativeLuminance(r, g, b) {&lt;/code&gt;&lt;/p&gt;&lt;br&gt;
&lt;p&gt;// Linearize each channel&lt;/p&gt;&lt;br&gt;
&lt;p&gt;const linear = [r, g, b].map(channel =&amp;gt; {&lt;/p&gt;&lt;br&gt;
&lt;p&gt;const c = channel / 255;&lt;/p&gt;&lt;br&gt;
&lt;p&gt;return c &amp;lt;= 0.03928&lt;/p&gt;&lt;br&gt;
&lt;p&gt;? c / 12.92&lt;/p&gt;&lt;br&gt;
&lt;p&gt;: Math.pow((c + 0.055) / 1.055, 2.4);&lt;/p&gt;&lt;br&gt;
&lt;p&gt;});&lt;/p&gt;&lt;br&gt;
&lt;p&gt;return 0.2126 &lt;em&gt; linear[0] + 0.7152 &lt;/em&gt; linear[1] + 0.0722 * linear[2];&lt;/p&gt;&lt;br&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;function contrastRatio(rgb1, rgb2) {&lt;/p&gt;
&lt;p&gt;const l1 = relativeLuminance(...rgb1);&lt;/p&gt;
&lt;p&gt;const l2 = relativeLuminance(...rgb2);&lt;/p&gt;
&lt;p&gt;const lighter = Math.max(l1, l2);&lt;/p&gt;
&lt;p&gt;const darker = Math.min(l1, l2);&lt;/p&gt;
&lt;p&gt;return (lighter + 0.05) / (darker + 0.05);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;contrastRatio([47, 133, 90], [255, 255, 255])&lt;/p&gt;
&lt;p&gt;// → 5.08 (passes AA for normal text)&lt;/p&gt;
&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For quick checking without code, a &lt;a rel=&quot;nofollow&quot; href=&quot;https://snappytools.app/color-contrast-checker/&quot;&gt;color contrast checker&lt;/a&gt; calculates the ratio and WCAG verdict instantly when you enter the two hex values.&lt;/p&gt;
&lt;h2&gt;Common contrast failures&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Gray text on white:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;p&gt;Many design systems use light gray text for secondary/placeholder content. Typical failures:&lt;/p&gt;
&lt;p&gt;| Text color | Background | Ratio | Result |&lt;/p&gt;
&lt;p&gt;|-----------|-----------|-------|--------|&lt;/p&gt;
&lt;p&gt;| #999999 | #ffffff | 2.85:1 | Fails AA |&lt;/p&gt;
&lt;p&gt;| #767676 | #ffffff | 4.54:1 | Passes AA |&lt;/p&gt;
&lt;p&gt;| #595959 | #ffffff | 7.22:1 | Passes AAA |&lt;/p&gt;
&lt;p&gt;The lightest gray that passes AA on white is approximately #767676&lt;code&gt;.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;White text on color:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;p&gt;| Background | Ratio | Result |&lt;/p&gt;&lt;br&gt;
&lt;p&gt;|-----------|-------|--------|&lt;/p&gt;&lt;br&gt;
&lt;p&gt;| #3182ce (medium blue) | 4.6:1 | Passes AA |&lt;/p&gt;&lt;br&gt;
&lt;p&gt;| #e53e3e (medium red) | 4.07:1 | Fails AA for normal text |&lt;/p&gt;&lt;br&gt;
&lt;p&gt;| #d69e2e (medium yellow) | 2.21:1 | Fails AA |&lt;/p&gt;
&lt;p&gt;Yellow and light colors almost never achieve sufficient contrast with white text. Use dark text on yellow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dark mode issues:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;p&gt;Inverting a light-mode color scheme doesn't guarantee contrast compliance. Check both modes separately.&lt;/p&gt;
&lt;h2&gt;Automating contrast checks&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Storybook a11y addon:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;code&amp;gt;bash
&amp;lt;p&amp;gt;npm install --save-dev @storybook/addon-a11y&amp;lt;/p&amp;gt;
&amp;lt;/code&amp;gt;&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Add to .storybook/main.js&lt;code&gt;:&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;code&amp;gt;javascript
&amp;lt;p&amp;gt;module.exports = { addons: ['@storybook/addon-a11y'] };&amp;lt;/p&amp;gt;
&amp;lt;/code&amp;gt;&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The a11y addon runs axe accessibility checks on each story, including contrast ratio.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Playwright / Cypress:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;`&lt;code&gt;javascript&lt;br&gt;
// Using axe-core with Playwright&lt;/code&gt;&lt;/p&gt;&lt;br&gt;
&lt;p&gt;import { checkA11y } from 'axe-playwright';&lt;/p&gt;
&lt;p&gt;test('passes contrast checks', async ({ page }) =&amp;gt; {&lt;/p&gt;
&lt;p&gt;await page.goto('/');&lt;/p&gt;
&lt;p&gt;await checkA11y(page, null, {&lt;/p&gt;
&lt;p&gt;runOnly: { type: 'tag', values: ['wcag2aa'] }&lt;/p&gt;
&lt;p&gt;});&lt;/p&gt;
&lt;p&gt;});&lt;/p&gt;
&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lighthouse:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;p&gt;Run from the command line:&lt;/p&gt;&lt;br&gt;
&lt;code&gt;&amp;lt;code&amp;gt;bash
&amp;lt;p&amp;gt;npx lighthouse https://example.com --only-categories=accessibility --output json&amp;lt;/p&amp;gt;
&amp;lt;/code&amp;gt;&lt;/code&gt;&lt;code&gt;
Lighthouse's accessibility score covers contrast ratios for text elements automatically.
&lt;strong&gt;axe-core in browser:&lt;/strong&gt;&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&amp;lt;code&amp;gt;javascript
&amp;lt;p&amp;gt;// Install: npm install axe-core&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;import axe from 'axe-core';&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;axe.run(document, { runOnly: { type: 'tag', values: ['wcag2aa'] } })&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;.then(results =&amp;gt; {&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;results.violations.forEach(v =&amp;gt; {&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;console.log(v.id, v.description, v.nodes);&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;});&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;});&amp;lt;/p&amp;gt;
&amp;lt;/code&amp;gt;&lt;/code&gt;&lt;code&gt;
Design tool support
&lt;strong&gt;Figma:&lt;/strong&gt; Select a text layer, check the Fill section in the right panel — Figma shows the contrast ratio and AA/AAA pass/fail against the element behind it. The &quot;Figma A11y&quot; plugin and &quot;Contrast&quot; plugin provide more detailed analysis.
&lt;strong&gt;Sketch:&lt;/strong&gt; The &quot;Stark&quot; plugin provides WCAG contrast checking inline.
&lt;strong&gt;Adobe XD:&lt;/strong&gt; Built-in accessibility checker includes contrast. The &quot;Able&quot; plugin provides additional detail.
Fixing low-contrast designs
When a design fails contrast:
&lt;strong&gt;Option 1: Darken the text color&lt;/strong&gt; (preserves the design's background)&lt;br&gt;
&lt;/code&gt;`&lt;code&gt;css&lt;br&gt;
/&lt;em&gt; Failed: #999 on white &lt;/em&gt;/&lt;br&gt;
color: #999999;
/&lt;em&gt; Fixed: darkened to pass AA &lt;/em&gt;/
color: #767676;
&lt;/code&gt;`&lt;code&gt;
&lt;strong&gt;Option 2: Lighten the background&lt;/strong&gt;&lt;br&gt;
For text on a dark background that's too dark — lighten the background until contrast passes.
&lt;strong&gt;Option 3: Use an intermediate shade for all states&lt;/strong&gt;&lt;br&gt;
If a brand color fails contrast as text-on-white, use a darker shade:&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&amp;lt;code&amp;gt;css
&amp;lt;p&amp;gt;:root {&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;--brand: hsl(145, 48%, 45%);        /&amp;lt;em&amp;gt; Too light for text on white &amp;lt;/em&amp;gt;/&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;--brand-accessible: hsl(145, 48%, 35%); /&amp;lt;em&amp;gt; Darker, passes AA &amp;lt;/em&amp;gt;/&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;}&amp;lt;/p&amp;gt;
&amp;lt;/code&amp;gt;&lt;/code&gt;`
&lt;p&gt;&lt;strong&gt;Check WCAG 3.0:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;p&gt;WCAG 3.0 introduces the APCA (Advanced Perceptual Contrast Algorithm), which is more accurate for low-contrast situations and replaces the simple ratio with a perceptual model. It's not yet a legal standard, but design tools and validators are beginning to include it alongside the traditional ratio.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Color contrast is a straightforward accessibility requirement with clear pass/fail criteria. Building contrast checking into your design review and CI pipeline catches failures before they reach production.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a rel=&quot;nofollow&quot; href=&quot;https://snappytools.app/color-contrast-checker/&quot;&gt;https://snappytools.app/color-contrast-checker/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/19289/wcag-color-contrast-what-developers-need-to-know-about-accessibility</guid>
<pubDate>Sun, 31 May 2026 10:43:39 +0000</pubDate>
</item>
<item>
<title>Iris: An Offline Visual Assistant in Brazilian Portuguese Powered by Gemma 4</title>
<link>https://coderlegion.com/17949/iris-an-offline-visual-assistant-in-brazilian-portuguese-powered-by-gemma-4</link>
<description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/challenges/google-gemma-2026-05-06&quot;&gt;Gemma 4 Challenge: Build with Gemma 4&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Iris&lt;/strong&gt; is an Android visual assistant for blind and low-vision users.&lt;/li&gt;
&lt;li&gt;It describes what the camera sees, out loud, in &lt;strong&gt;Brazilian Portuguese&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemma 4 multimodal&lt;/strong&gt; runs &lt;strong&gt;100% on the phone&lt;/strong&gt; via LiteRT-LM — no cloud, no telemetry, no &lt;code&gt;INTERNET&lt;/code&gt; permission.&lt;/li&gt;
&lt;li&gt;Three intent-specific modes: Continuous, Question, Reading.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;what-i-built&quot;&gt;What I Built&lt;/h3&gt;
&lt;p&gt;I built &lt;strong&gt;Iris&lt;/strong&gt;, an offline Android visual assistant for blind and low-vision users.&lt;/p&gt;
&lt;p&gt;The interaction is intentionally simple: point the phone camera at something, tap the screen, and Iris speaks what it sees in Brazilian Portuguese.&lt;/p&gt;
&lt;p&gt;Iris has three modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Continuous Mode&lt;/strong&gt; describes the scene in front of the user.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Question Mode&lt;/strong&gt; lets the user ask a spoken question about the current camera image.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reading Mode&lt;/strong&gt; reads visible text aloud, such as a label, medicine box, sign, or package.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A fourth control, &lt;strong&gt;Repeat&lt;/strong&gt;, replays the last description — useful for users who could not catch it all the first time.&lt;/p&gt;
&lt;p&gt;The core constraint was not only &quot;can Gemma 4 understand the image?&quot; — the real question was whether this could still be useful when the camera is looking at private, everyday scenes and the user may not have a reliable network connection.&lt;/p&gt;
&lt;p&gt;That led to the main technical decision: &lt;strong&gt;everything runs on the phone&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;No server. No cloud API. No telemetry. No &lt;code&gt;INTERNET&lt;/code&gt; permission in the Android manifest.&lt;/p&gt;
&lt;h3 id=&quot;demo&quot;&gt;Demo&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://youtu.be/cdug6i_HEJM&quot;&gt;https://youtu.be/cdug6i_HEJM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The demo shows Iris running on a Galaxy S21 with airplane mode visible. The right side of the video is the actual phone screen; the left side explains what each mode is doing.&lt;/p&gt;
&lt;p&gt;The video is not meant to hide the on-device latency. On a Galaxy S21, the first spoken sentence arrives in roughly 25–30 seconds after the tap. The wait is part of the point: Gemma 4 is doing the multimodal work locally, on the phone, with no help from a server.&lt;/p&gt;
&lt;h3 id=&quot;code&quot;&gt;Code&lt;/h3&gt;
&lt;p&gt;Repository:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/juniormartinxo/iris&quot;&gt;https://github.com/juniormartinxo/iris&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The project is a native Android app built with Kotlin, Jetpack Compose, CameraX, Android TTS/STT, and LiteRT-LM.&lt;/p&gt;
&lt;h3 id=&quot;why-this-app-needed-to-be-offline&quot;&gt;Why This App Needed To Be Offline&lt;/h3&gt;
&lt;p&gt;A visual assistant sees the user's world.&lt;/p&gt;
&lt;p&gt;That can mean a medicine label, a document on a desk, a room at home, a person nearby, a screen, or an object the user is trying to identify. For this kind of app, &quot;send the image to a server&quot; is not a neutral implementation detail. It changes the privacy model of the product.&lt;/p&gt;
&lt;p&gt;I wanted Iris to have a stronger boundary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;camera frames stay on the device;&lt;/li&gt;
&lt;li&gt;speech recognition uses Android's on-device recognizer;&lt;/li&gt;
&lt;li&gt;speech output uses Android Text-to-Speech;&lt;/li&gt;
&lt;li&gt;Gemma 4 runs through LiteRT-LM locally;&lt;/li&gt;
&lt;li&gt;the app does not request Internet access.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Android manifest only asks for the permissions the app needs to see and hear:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;uses-permission android:name=&quot;android.permission.CAMERA&quot; /&amp;gt;
&amp;lt;uses-permission android:name=&quot;android.permission.RECORD_AUDIO&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There is no &lt;code&gt;android.permission.INTERNET&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That means the app cannot silently fall back to a network call unless a future version explicitly changes the permission model.&lt;/p&gt;
&lt;h3 id=&quot;how-i-used-gemma-4&quot;&gt;How I Used Gemma 4&lt;/h3&gt;
&lt;p&gt;Iris uses &lt;strong&gt;Gemma 4 E2B&lt;/strong&gt; as the primary model, packaged as a &lt;code&gt;.litertlm&lt;/code&gt; bundle and loaded with LiteRT-LM on Android.&lt;/p&gt;
&lt;p&gt;I chose E2B because the target device is a phone, not a workstation. The challenge prompt asks builders to be intentional about model selection, and for this project the priority was clear: local multimodal inference with the smallest model that could still make the experience meaningful.&lt;/p&gt;
&lt;p&gt;The app can also look for an E4B bundle as a fallback, but the loading order prefers E2B:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val MODEL_CANDIDATES: List&amp;lt;Pair&amp;lt;String, String&amp;gt;&amp;gt; = listOf(
    &quot;E2B&quot; to &quot;gemma-4-E2B-it.litertlm&quot;,
    &quot;E4B&quot; to &quot;gemma-4-E4B-it.litertlm&quot;,
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For the current demo, E2B is the right trade-off: it keeps the app viable on devices like the Galaxy S21 and A55 while still giving Iris native multimodal understanding.&lt;/p&gt;
&lt;p&gt;The app sends Gemma 4 one camera frame plus a mode-specific prompt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;in &lt;strong&gt;Continuous Mode&lt;/strong&gt;, the prompt asks for a short scene description focused on obstacles, relevant objects, visible text, and people;&lt;/li&gt;
&lt;li&gt;in &lt;strong&gt;Question Mode&lt;/strong&gt;, Android's on-device speech recognizer captures the user's question, then Gemma 4 answers using the current image;&lt;/li&gt;
&lt;li&gt;in &lt;strong&gt;Reading Mode&lt;/strong&gt;, the prompt asks Gemma 4 to read visible text from top to bottom and left to right.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All prompts ask for Brazilian Portuguese output because the product is designed for PT-BR users first.&lt;/p&gt;
&lt;h3 id=&quot;architecture&quot;&gt;Architecture&lt;/h3&gt;
&lt;p&gt;The runtime path is deliberately small:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;CameraX preview
  -&amp;gt; capture current frame
  -&amp;gt; downsample image to a 512px longest edge
  -&amp;gt; run frame quality checks
  -&amp;gt; Gemma 4 E2B through LiteRT-LM
  -&amp;gt; sentence buffer
  -&amp;gt; Android Text-to-Speech
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There are a few details in that pipeline that matter.&lt;/p&gt;
&lt;h4 id=&quot;1-frame-quality-checks-before-inference&quot;&gt;1. Frame quality checks before inference&lt;/h4&gt;
&lt;p&gt;On-device multimodal inference is expensive enough that Iris should not waste a run on a useless image.&lt;/p&gt;
&lt;p&gt;Before calling Gemma 4, the app calculates a small set of image quality signals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;brightness;&lt;/li&gt;
&lt;li&gt;luminance variance;&lt;/li&gt;
&lt;li&gt;a simple blur score.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the image is too dark, too bright, too empty, or too blurry, Iris speaks a direct instruction like:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;Imagem muito escura. Verifique a iluminação ou se há algo cobrindo a câmera.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is better than waiting through a slow inference only to get a weak answer.&lt;/p&gt;
&lt;h4 id=&quot;2-sentence-streaming-into-tts&quot;&gt;2. Sentence streaming into TTS&lt;/h4&gt;
&lt;p&gt;LiteRT-LM returns text chunks. Iris does not wait for the entire response before speaking.&lt;/p&gt;
&lt;p&gt;A small &lt;code&gt;SentenceBuffer&lt;/code&gt; collects chunks until it sees a sentence boundary, then sends each sentence to Android TTS. The user hears the first useful sentence as soon as possible, while the model can still finish the rest of the response.&lt;/p&gt;
&lt;p&gt;For accessibility, this is not just a polish detail. Silence during a long local inference can feel like the app froze. Iris speaks &quot;Aguarde.&quot; as a progress beacon every 15 seconds while inference is still running. The moment the first sentence arrives from the model, the loading overlay disappears and the description starts streaming into the screen — one sentence at a time — so visual and audio feedback stay in sync.&lt;/p&gt;
&lt;h4 id=&quot;3-modes-are-prompt-engineering-exposed-as-ui&quot;&gt;3. Modes are prompt engineering exposed as UI&lt;/h4&gt;
&lt;p&gt;I did not want one generic &quot;describe&quot; button to handle every situation.&lt;/p&gt;
&lt;p&gt;Blind and low-vision users often know what they need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;What is in front of me?&quot;&lt;/li&gt;
&lt;li&gt;&quot;Is there a silver object here?&quot;&lt;/li&gt;
&lt;li&gt;&quot;Read this medicine box.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The three modes let the UI choose the prompt shape before the model runs. This keeps the responses shorter, more predictable, and easier to listen to.&lt;/p&gt;
&lt;h4 id=&quot;4-talkback-aware-behavior&quot;&gt;4. TalkBack-aware behavior&lt;/h4&gt;
&lt;p&gt;Iris is built around audio, but Android accessibility already has an audio layer: TalkBack.&lt;/p&gt;
&lt;p&gt;When TalkBack is enabled, Iris avoids speaking over UI announcements. When TalkBack is not enabled, Iris uses its own TTS announcements for mode changes, loading states, errors, and tutorial flow.&lt;/p&gt;
&lt;p&gt;Every primary control has a &lt;code&gt;contentDescription&lt;/code&gt;, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Continuous Mode;&lt;/li&gt;
&lt;li&gt;Question Mode;&lt;/li&gt;
&lt;li&gt;Reading Mode;&lt;/li&gt;
&lt;li&gt;Repeat.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This lets the same interface work for screen-reader users and for users who are not running TalkBack.&lt;/p&gt;
&lt;h3 id=&quot;performance-on-the-galaxy-s21&quot;&gt;Performance on the Galaxy S21&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Step &lt;/th&gt;&lt;th&gt;Time / size&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Cold start to &quot;Ready&quot; (model load) &lt;/td&gt;&lt;td&gt;~10–30 s&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Tap → first spoken word &lt;/td&gt;&lt;td&gt;~25–35 s&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Tap → full response done &lt;/td&gt;&lt;td&gt;~35–50 s&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Memory while idle (model loaded) &lt;/td&gt;&lt;td&gt;~3 GB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;APK size (debug) &lt;/td&gt;&lt;td&gt;~99 MB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Model bundle (sideloaded &lt;code&gt;.litertlm&lt;/code&gt;) &lt;/td&gt;&lt;td&gt;~2.59 GB&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These are not best-in-class numbers. They are the cost of doing multimodal inference fully on-device on a 2021 phone. The UX is designed around making that wait legible, not invisible — that is what the progress beacon and the sentence streaming are for.&lt;/p&gt;
&lt;p&gt;Numbers above are approximate, taken on a single Galaxy S21 unit. They will vary by device, by ambient thermal state, and by how much memory the rest of the system is using.&lt;/p&gt;
&lt;h3 id=&quot;what-gemma-4-unlocked&quot;&gt;What Gemma 4 Unlocked&lt;/h3&gt;
&lt;p&gt;The important thing about Gemma 4 here is not only that it can caption an image.&lt;/p&gt;
&lt;p&gt;It lets Iris treat visual assistance as a flexible language problem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a scene can be summarized;&lt;/li&gt;
&lt;li&gt;a user question can be grounded in the image;&lt;/li&gt;
&lt;li&gt;visible text can be read in context;&lt;/li&gt;
&lt;li&gt;the output can be constrained to short, spoken PT-BR sentences.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without a multimodal model, this app would likely become a collection of separate systems: one detector, one OCR pipeline, one classifier, one rules engine, and a lot of glue code. That can be the right architecture for a mature product, but it is much heavier for a fast prototype.&lt;/p&gt;
&lt;p&gt;Gemma 4 made it possible to build one coherent loop:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;image + intent -&amp;gt; useful spoken answer&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;what-was-hard&quot;&gt;What Was Hard&lt;/h3&gt;
&lt;p&gt;The hardest part was not wiring the camera to the model. It was making the experience feel reliable enough for an audio-first user.&lt;/p&gt;
&lt;p&gt;Some examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The app must tell the user when the model is still working.&lt;/li&gt;
&lt;li&gt;A second tap should cancel or replace the previous flow cleanly.&lt;/li&gt;
&lt;li&gt;If speech recognition is unavailable offline, the app should explain that instead of failing silently.&lt;/li&gt;
&lt;li&gt;If the camera points at a blank wall, the model should not invent a detailed scene.&lt;/li&gt;
&lt;li&gt;If the device is too hot, the app should refuse another expensive inference instead of making the phone worse.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some other details would have been invisible in a tech demo but mattered for a real app: guarding the camera tap area against overlay-based tap-jacking, capping the crash log file size so a failure loop cannot fill the disk, synchronizing access to the speech recognizer so it cannot be torn down mid-utterance. Each one came from imagining what a confused or panicked user would experience.&lt;/p&gt;
&lt;p&gt;Iris is still a prototype, but these details are the difference between a tech demo and something that starts to behave like a product.&lt;/p&gt;
&lt;h3 id=&quot;limitations&quot;&gt;Limitations&lt;/h3&gt;
&lt;p&gt;The current version has real constraints.&lt;/p&gt;
&lt;p&gt;First, local inference on a Galaxy S21 can take a while. That is the cost of running a multimodal model offline on a phone-class device. The app is designed to keep the user informed during that wait, but latency is still the biggest UX limitation.&lt;/p&gt;
&lt;p&gt;Second, Iris is not a navigation or safety-critical tool. It can describe what the camera sees, but it should not be used as the only source of truth for crossing streets, avoiding hazards, or making medical decisions.&lt;/p&gt;
&lt;p&gt;Third, Reading Mode uses Gemma 4's multimodal ability rather than a dedicated OCR engine. That keeps the architecture simple and demonstrates what the model can do, but a production version might combine Gemma 4 with a specialized OCR pipeline for speed and fidelity.&lt;/p&gt;
&lt;h3 id=&quot;try-it-yourself&quot;&gt;Try It Yourself&lt;/h3&gt;
&lt;p&gt;The model is sideloaded because it is large. The app expects the LiteRT-LM bundle under the app's external files directory.&lt;/p&gt;
&lt;p&gt;Short version:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./gradlew :app:assembleDebug

adb install -r app/build/outputs/apk/debug/iris-0.1.0-debug.apk

adb push gemma-4-E2B-it.litertlm \
  /sdcard/Android/data/com.iris/files/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Model source:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://huggingface.co/litert-community/gemma-4-E2B-it-litert-lm&quot;&gt;https://huggingface.co/litert-community/gemma-4-E2B-it-litert-lm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The README includes the full setup notes, including Android version, memory, storage, and offline PT-BR TTS/STT requirements.&lt;/p&gt;
&lt;h3 id=&quot;what-s-next&quot;&gt;What's Next&lt;/h3&gt;
&lt;p&gt;The next improvements I would make are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;test the same build across more Android devices;&lt;/li&gt;
&lt;li&gt;improve latency with better model/runtime configuration;&lt;/li&gt;
&lt;li&gt;add a more explicit first-run checklist for offline language packs;&lt;/li&gt;
&lt;li&gt;explore a hybrid Reading Mode that uses dedicated OCR when speed matters;&lt;/li&gt;
&lt;li&gt;keep the permission model strict: no Internet unless the product direction changes openly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;acknowledgments&quot;&gt;Acknowledgments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Google AI Edge&lt;/strong&gt; team for LiteRT-LM, which makes running Gemma 4 on Android tractable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;litert-community&lt;/code&gt;&lt;/strong&gt; on Hugging Face for the &lt;code&gt;.litertlm&lt;/code&gt; model bundles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anthropic Claude Code&lt;/strong&gt; was used as a pair-programming assistant during development of the Android code, the UX logic, and parts of this article.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;closing&quot;&gt;Closing&lt;/h3&gt;
&lt;p&gt;Iris is small, but it represents the kind of app I want to see more often: local-first, accessibility-first, and built for a real language community instead of assuming English by default.&lt;/p&gt;
&lt;p&gt;Gemma 4 made the prototype possible because it brought multimodal understanding close enough to the device. LiteRT-LM made it possible to run that loop inside Android.&lt;/p&gt;
&lt;p&gt;The result is simple:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The camera sees. Gemma 4 understands. Iris speaks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And it does that without sending the image anywhere.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/17949/iris-an-offline-visual-assistant-in-brazilian-portuguese-powered-by-gemma-4</guid>
<pubDate>Fri, 15 May 2026 11:53:10 +0000</pubDate>
</item>
<item>
<title>Color Contrast for Web Accessibility: WCAG AA vs AAA Explained</title>
<link>https://coderlegion.com/17803/color-contrast-for-web-accessibility-wcag-aa-vs-aaa-explained</link>
<description>&lt;p&gt;If you have ever squinted at a website trying to read light grey text on a white background, you have experienced poor color contrast. It is uncomfortable for everyone. For people with low vision, color blindness, or cognitive disabilities, it makes content completely inaccessible.&lt;/p&gt;
&lt;p&gt;The Web Content Accessibility Guidelines (WCAG) give us a mathematical standard for color contrast, and every modern web developer should understand it.&lt;/p&gt;
&lt;h2&gt;What Is the Contrast Ratio?&lt;/h2&gt;
&lt;p&gt;The contrast ratio compares the relative luminance of two colors. Luminance is a measure of how much light a color emits — white is 1.0, black is 0.0.&lt;/p&gt;
&lt;p&gt;The formula is:&lt;/p&gt;
&lt;p&gt;``&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;ratio = (L1 + 0.05) / (L2 + 0.05)&lt;/p&gt;
&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Where L1 is the lighter color's luminance and L2 is the darker one's. Ratios range from 1:1 (no contrast, same color) to 21:1 (black on white, maximum contrast).&lt;/p&gt;
&lt;p&gt;To get luminance from an RGB value, you first linearize each channel, then apply weights that reflect how the human eye perceives brightness:&lt;/p&gt;
&lt;p&gt;`&lt;code&gt;javascript&lt;br&gt;
function getLuminance(r, g, b) {&lt;/code&gt;&lt;/p&gt;&lt;br&gt;
&lt;p&gt;const [rs, gs, bs] = [r, g, b].map(c =&amp;gt; {&lt;/p&gt;&lt;br&gt;
&lt;p&gt;c /= 255;&lt;/p&gt;&lt;br&gt;
&lt;p&gt;return c &amp;lt;= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);&lt;/p&gt;&lt;br&gt;
&lt;p&gt;});&lt;/p&gt;&lt;br&gt;
&lt;p&gt;return 0.2126 &lt;em&gt; rs + 0.7152 &lt;/em&gt; gs + 0.0722 * bs;&lt;/p&gt;&lt;br&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;function contrastRatio(rgb1, rgb2) {&lt;/p&gt;
&lt;p&gt;const l1 = getLuminance(...rgb1);&lt;/p&gt;
&lt;p&gt;const l2 = getLuminance(...rgb2);&lt;/p&gt;
&lt;p&gt;const lighter = Math.max(l1, l2);&lt;/p&gt;
&lt;p&gt;const darker  = Math.min(l1, l2);&lt;/p&gt;
&lt;p&gt;return (lighter + 0.05) / (darker + 0.05);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;WCAG Levels: AA vs AAA&lt;/h2&gt;
&lt;p&gt;WCAG defines two conformance levels for contrast:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WCAG AA&lt;/strong&gt; — the minimum standard required by most accessibility laws (including ADA, EN 301 549, and Section 508 in the US):&lt;br&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Normal text (under 18pt or 14pt bold): &lt;strong&gt;4.5:1 minimum&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Large text (18pt+ or 14pt+ bold) and UI components: &lt;strong&gt;3:1 minimum&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
&lt;strong&gt;WCAG AAA&lt;/strong&gt; — the enhanced standard, recommended for critical text:&lt;br&gt;
&lt;ul&gt;&lt;li&gt;Normal text: &lt;strong&gt;7:1 minimum&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Large text: &lt;strong&gt;4.5:1 minimum&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
&lt;p&gt;Most teams aim for AA across the board and AAA for body copy on high-traffic pages.&lt;/p&gt;
&lt;h2&gt;Why the Green/Grey Traps Are So Common&lt;/h2&gt;
&lt;p&gt;Web designers often use brand colors without checking contrast. A company palette might include a medium-saturation green that looks vibrant in the style guide but fails AA when used as text on white.&lt;/p&gt;
&lt;p&gt;Common failure patterns:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Light grey text on white backgrounds&lt;/strong&gt; — a common UI pattern for secondary text that looks elegant but often fails at 2:1 or 3:1&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Coloured text on coloured backgrounds&lt;/strong&gt; — two medium-saturation colours in the same value range can clash at only 1.5:1&lt;/li&gt;&lt;li&gt;&lt;strong&gt;White text on mid-tone brand colours&lt;/strong&gt; — a teal, orange, or green at 50% brightness barely reaches 3:1 against white&lt;/li&gt;&lt;/ul&gt;
&lt;h2&gt;Fixing Contrast Without Losing Your Design&lt;/h2&gt;
&lt;p&gt;You do not usually need to replace your brand colors. Adjust lightness:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;For text on white: darken the text color until it passes&lt;/li&gt;&lt;li&gt;For white text on a colored background: darken the background until it passes&lt;/li&gt;&lt;li&gt;For body copy: use black or near-black (#1a1a1a) on white — instant 19:1 ratio&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;In CSS, the color-mix()&lt;code&gt; function (now well-supported) makes this easy:&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;`&lt;code&gt;css&lt;br&gt;
/&lt;em&gt; Start with your brand color &lt;/em&gt;/&lt;/code&gt;&lt;/p&gt;&lt;br&gt;
&lt;p&gt;--brand: #4a9a6f;&lt;/p&gt;
&lt;p&gt;/&lt;em&gt; For text, darken it &lt;/em&gt;/&lt;/p&gt;
&lt;p&gt;--text-primary: color-mix(in srgb, var(--brand) 60%, black);&lt;/p&gt;
&lt;p&gt;/&lt;em&gt; For backgrounds, lighten it &lt;/em&gt;/&lt;/p&gt;
&lt;p&gt;--bg-accent: color-mix(in srgb, var(--brand) 20%, white);&lt;/p&gt;
&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Testing Your Palette&lt;/h2&gt;
&lt;p&gt;You can check contrast ratios manually using the formula above, or use a browser-based tool. The &lt;a rel=&quot;nofollow&quot; href=&quot;https://snappytools.app/color-contrast-checker/&quot;&gt;SnappyTools Color Contrast Checker&lt;/a&gt; lets you enter two hex colors, shows the contrast ratio, and tells you instantly whether it passes WCAG AA and AAA for normal text, large text, and UI components. It runs entirely in the browser.&lt;/p&gt;
&lt;p&gt;For systematic palette audits, use browser DevTools. In Chrome, opening any color in DevTools shows the contrast ratio inline and flags AA/AAA status with a warning icon.&lt;/p&gt;
&lt;h2&gt;Automated Testing in CI&lt;/h2&gt;
&lt;p&gt;Manual checking is not enough for large codebases. Add automated contrast checking to your CI pipeline:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;axe-core&lt;/strong&gt; — integrates with Jest, Cypress, and Playwright. Runs a full accessibility audit including contrast failures.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Storybook a11y addon&lt;/strong&gt; — shows contrast issues per component during development&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Lighthouse&lt;/strong&gt; — checks contrast for rendered pages and reports failures in the accessibility audit section&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;A typical axe-core integration in Playwright:&lt;/p&gt;
&lt;p&gt;`&lt;code&gt;javascript&lt;br&gt;
import { checkA11y } from 'axe-playwright';&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;test('homepage passes contrast checks', async ({ page }) =&amp;gt; {&lt;/p&gt;
&lt;p&gt;await page.goto('/');&lt;/p&gt;
&lt;p&gt;await checkA11y(page, null, {&lt;/p&gt;
&lt;p&gt;runOnly: { type: 'tag', values: ['wcag2aa'] },&lt;/p&gt;
&lt;p&gt;});&lt;/p&gt;
&lt;p&gt;});&lt;/p&gt;
&lt;p&gt;``&lt;/p&gt;
&lt;p&gt;This catches regressions before they reach production.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Contrast ratio measures luminance difference between two colors (1:1 to 21:1)&lt;/li&gt;&lt;li&gt;WCAG AA: 4.5:1 for normal text, 3:1 for large text — required by most accessibility laws&lt;/li&gt;&lt;li&gt;WCAG AAA: 7:1 for normal text — recommended for body copy&lt;/li&gt;&lt;li&gt;The most common failures are light grey on white and brand colors without luminance adjustment&lt;/li&gt;&lt;li&gt;Fix by darkening text or darkening the background color — rarely need to change the hue&lt;/li&gt;&lt;li&gt;Automate with axe-core in CI to prevent regressions&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Accessible color contrast is one of the cheapest accessibility wins available — it costs nothing to check and usually takes five minutes to fix.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a rel=&quot;nofollow&quot; href=&quot;https://snappytools.app/color-contrast-checker/&quot;&gt;https://snappytools.app/color-contrast-checker/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/17803/color-contrast-for-web-accessibility-wcag-aa-vs-aaa-explained</guid>
<pubDate>Thu, 14 May 2026 10:09:39 +0000</pubDate>
</item>
<item>
<title>Describe Image</title>
<link>https://coderlegion.com/17413/describe-image</link>
<description>&lt;p&gt;I recently launched &lt;a rel=&quot;nofollow&quot; href=&quot;https://describeimage.io/&quot;&gt;Describe Image&lt;/a&gt;, an AI image-to-text tool for turning images and short videos into clear, reusable written content.&lt;/p&gt;
&lt;p&gt;The tool is built for creators, marketers, bloggers, website owners, e-commerce sellers, accessibility workflows, and anyone who needs to describe visual content quickly.&lt;/p&gt;
&lt;h3 id=&quot;what-it-does&quot;&gt;What it does&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://describeimage.io&quot;&gt;Describe Image&lt;/a&gt; can generate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Detailed image descriptions&lt;/li&gt;
&lt;li&gt;Brief image summaries&lt;/li&gt;
&lt;li&gt;Alt text for accessibility&lt;/li&gt;
&lt;li&gt;OCR text from screenshots and documents&lt;/li&gt;
&lt;li&gt;Social media captions&lt;/li&gt;
&lt;li&gt;SEO-friendly image descriptions&lt;/li&gt;
&lt;li&gt;Product listing copy&lt;/li&gt;
&lt;li&gt;Chart analysis&lt;/li&gt;
&lt;li&gt;Document summaries&lt;/li&gt;
&lt;li&gt;Image-to-prompt results&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;why-i-built-it&quot;&gt;Why I built it&lt;/h3&gt;
&lt;p&gt;A lot of modern workflows start with an image, but the next step often needs text. A product photo may need a listing description. A screenshot may need OCR. A website image may need alt text. A chart may need a short explanation. A visual reference may need to become a prompt.&lt;/p&gt;
&lt;p&gt;Describe Image is designed to make that process faster. Users can upload an image, choose the output type they need, and get a practical first draft in seconds.&lt;/p&gt;
&lt;h3 id=&quot;who-it-is-for&quot;&gt;Who it is for&lt;/h3&gt;
&lt;p&gt;The tool is useful for people who regularly work with visual content, including content creators, marketers, bloggers, e-commerce sellers, website owners, students, and teams working on accessibility or SEO.&lt;/p&gt;
&lt;p&gt;The goal is not to replace human editing, but to reduce repetitive writing work and make images easier to understand, search, edit, and reuse.&lt;/p&gt;
</description>
<category>Launches</category>
<guid isPermaLink="true">https://coderlegion.com/17413/describe-image</guid>
<pubDate>Mon, 11 May 2026 09:34:59 +0000</pubDate>
</item>
<item>
<title>Free upcoming accessibility education events in May</title>
<link>https://coderlegion.com/16836/free-upcoming-accessibility-education-events-in-may</link>
<description>&lt;h3 id=&quot;funka-foundation-accessible-name-make-it-or-break-it-&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://stiftelsenfunka.org/whats-up/free-friday-webinars/accessible-name-make-it-or-break-it/&quot;&gt;Funka Foundation: Accessible name – make it or break it&lt;/a&gt; &lt;/h3&gt;
&lt;p&gt;Friday, May 8, 13.30-14.00 CEST&lt;/p&gt;
&lt;p&gt;Every button, link, and image on your interface must have an accessible name. Get it right and assistive technology users can find it, understand it, and activate it. Get it wrong and you have locked them out completely.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;trusted-tester-study-group-8-sensory-characteristics-and-contrast-tables&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://gdg.community.dev/events/details/google-gdg-vienna-presents-dhs-trusted-tester-study-group-8-sensory-characteristics-and-contrast-tables/&quot;&gt;Trusted Tester Study Group 8: Sensory Characteristics and Contrast + Tables&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Friday May 15, 4:00 – 5:00 PM (GMT+2)&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;accessible-does-not-equal-equitable-real-human-experience-vs-compliance&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://us06web.zoom.us/webinar/register/WN_Lx91kTk9TtqvMmhdLS_dGQ&quot;&gt;Accessible does not equal Equitable: Real Human Experience vs Compliance&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Thursday, 20 May | 10 AM AEST&lt;/p&gt;
&lt;p&gt;In this webinar to celebrate Global Accessibility Awareness Day (GAAD), we explore the uncomfortable truth that a product can be fully compliant and still fail the people it’s meant to support. Drawing on real user experiences, we’ll expose the hidden friction that standards don’t capture, from cognitive overload to interaction fatigue and loss of confidence.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;all-the-questions-you-wanted-to-ask-during-gaad---but-didn-t-get-the-chance&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.eventbrite.co.uk/e/digital-accessibility-experts-live-tickets-111949261254&quot;&gt;All the questions you wanted to ask during GAAD - but didn’t get the chance&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Thursday 28th May 4pm UK-time&lt;/p&gt;
&lt;p&gt;Global Accessibility Awareness Day (GAAD) on Thursday 21st May is always energising. But once the week is over, the momentum can fade. The questions people meant to ask never get asked. The practical “what do we actually do now?” conversations don’t happen.&lt;/p&gt;
&lt;p&gt;So the week after GAAD Hassell Inclusion is hosting an open Q&amp;amp;A session with many seasoned accessibility experts, so you can ask the questions you need to make accessibility for 2026 not just for GAAD.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/16836/free-upcoming-accessibility-education-events-in-may</guid>
<pubDate>Wed, 06 May 2026 07:56:35 +0000</pubDate>
</item>
<item>
<title>Upcoming Accessibility Events in March 2026</title>
<link>https://coderlegion.com/12172/upcoming-accessibility-events-in-march-2026</link>
<description>&lt;h3 id=&quot;trusted-tester-study-group&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://gdg.community.dev/gdg-vienna/&quot;&gt;Trusted Tester Study Group&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Together with the Google Developer Group Vienna, I am hosting a study group for the Trusted Tester certification. Watch the previous session recordings &lt;a rel=&quot;nofollow&quot; href=&quot;https://youtu.be/NzBo3sU0ki8?si=iMGiEJuSGJiMSTs0&quot;&gt;on YouTube&lt;/a&gt;. The dates and topics this month are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Session 2: Auto-Playing and Auto-Updating Content + Flashing&lt;br&gt;
Friday 6 March, 4:00 – 5:00 PM (GMT+1)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Session 3: Keyboard Access and Focus&lt;br&gt;
Thursday 12 March, 6:00 – 7:00 PM (GMT+1)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Session 4: Forms&lt;br&gt;
Friday 20 March, 4:00 – 5:00 PM (GMT+1)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;digital-accessibility-experts-live-help-accessibility-is-going-in-the-wrong-direction-where-i-work-what-can-i-do-about-it-&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.eventbrite.co.uk/e/digital-accessibility-experts-live-tickets-1980705813407?utm-campaign=social&amp;amp;utm-content=attendeeshare&amp;amp;utm-medium=discovery&amp;amp;utm-term=listing&amp;amp;utm-source=cp&amp;amp;aff=ebdsshcopyurl&quot;&gt;Digital Accessibility Experts Live: Help! Accessibility is going in the wrong direction where I work. What can I do about it?&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Thursday 26th March 4 PM UK-time&lt;/p&gt;
&lt;p&gt;The global accessibility field grew in 2025. But many established accessibility initiatives in organisations also came under threat from the DEI backlash and economic budget cutting. 2026 is likely to be similar. So what can you do if your work comes under threat by decisions from your stakeholders?&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;accessibleeu-latvia---people-living-with-dementia-accessibility-solutions-amp-innovations-international-experience&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://accessible-eu-centre.ec.europa.eu/content-corner/events_en&quot;&gt;AccessibleEU Latvia - People Living with Dementia. Accessibility, Solutions &amp;amp; Innovations. International Experience&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Thursday 5 March 2026, 10:00 - 15:30 (EET)&lt;/p&gt;
&lt;p&gt;This AccessibleEU event organised in collaboration with the Latvia Alzheimer’s Association and the Association of Disabled Persons and their Friends ‘Apeirons’, aims to raise awareness among society, including policymakers, service providers, and professionals, about how to better support people with dementia and other cognitive disorders.&lt;/p&gt;
&lt;p&gt;Broadly defined accessibility plays a crucial role in enhancing the quality of life for these individuals - encompassing access to services, information, the built environment, and transportation.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;vienna-game-dev-meetup-no-diversity-no-games---how-inclusion-is-no-longer-optional&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.meetup.com/vienna-game-dev-meetup/events/313384044/?utm_medium=referral&amp;amp;utm_campaign=share-btn_savedevents_share_modal&amp;amp;utm_source=link&amp;amp;utm_version=v2&quot;&gt;Vienna Game Dev Meetup: No Diversity, No Games - How inclusion is no longer optional&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Tuesday, Mar 3 · 6:30 PM to 9:30 PM CET Das Packhaus: Marxergasse 24, 1030 Wien, Österreich&lt;/p&gt;
&lt;p&gt;The game industry has more talent, bigger budgets, and more powerful technology than ever before. Yet we’re stuck in sequels, safe bets, and recycled ideas. For decades, innovation was driven by hardware and graphics. That era is slowing down. Higher fidelity alone no longer creates novelty. Jack Gutmann argues that the next frontier of originality is perspective. Homogeneous teams create blind spots, predictable design, and cultural echo chambers, a form of creative inbreeding.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;vienna-women-techmakers-conference-break-the-pattern-&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://womentechmakers.at/conference/2026&quot;&gt;Vienna: Women Techmakers Conference “Break the Pattern”&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Saturday 14 March, 9:00 - 15:00 TUtheSky (Getreidemarkt 9, 1060 Vienna)&lt;/p&gt;
&lt;p&gt;Women Techmakers Vienna invites you to our International Women’s Day 2026 conference, themed “Break The Pattern.” Expect stories of non-traditional paths into tech and the moments women stepped up beyond their role to drive real change at work—improving processes, quality, leadership, and team culture. Come for practical takeaways, honest lessons, and new connections.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/12172/upcoming-accessibility-events-in-march-2026</guid>
<pubDate>Wed, 25 Feb 2026 09:30:15 +0000</pubDate>
</item>
<item>
<title>Effective HTML Elements for Accessibility in Web Design</title>
<link>https://coderlegion.com/12149/effective-html-elements-for-accessibility-in-web-design</link>
<description>&lt;p&gt;In the world of web design, ensuring accessibility is not just a best practice; it's a necessity. By leveraging the right HTML elements, developers can create web pages that are usable for everyone, including those with disabilities. Here are some key HTML features to focus on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Semantic HTML&lt;/strong&gt;: Use elements like &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt; to structure your content meaningfully. This helps screen readers interpret the page better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Forms and Inputs&lt;/strong&gt;: Properly label every form input using &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; tags. This improves the experience for users relying on assistive technologies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Alt Text for Images&lt;/strong&gt;: Always provide descriptive alt attributes for images using the &lt;code&gt;alt&lt;/code&gt; attribute. This ensures that users who cannot see the image still understand its purpose.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ARIA Roles&lt;/strong&gt;: When standard HTML cannot accommodate a specific requirement, consider using ARIA (Accessible Rich Internet Applications) roles to enhance assistive technology behavior. For instance, use &lt;code&gt;role=&quot;navigation&quot;&lt;/code&gt; to define navigation landmarks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Headings Hierarchy&lt;/strong&gt;: Maintain a clear heading structure using &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; through &lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; tags. This not only aids navigation for screen reader users but also assists with SEO.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By incorporating these techniques, you're not just conforming to legal requirements; you're creating a more inclusive web. Testing with various tools like WAVE or Axe can help you identify accessibility issues in your HTML implementation.&lt;/p&gt;
&lt;h4 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;Adopting accessible practices is imperative for the future of web design. Start with these HTML elements and continually look for opportunities to enhance accessibility in your projects. Your users will thank you, and so will search engines.&lt;/p&gt;
&lt;p&gt;Happy coding!&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/12149/effective-html-elements-for-accessibility-in-web-design</guid>
<pubDate>Tue, 24 Feb 2026 20:08:58 +0000</pubDate>
</item>
<item>
<title>Accessibility Education Events in February 2026</title>
<link>https://coderlegion.com/11685/accessibility-education-events-in-february-2026</link>
<description>&lt;h3 id=&quot;a11y-tokyo-meetup-accessibility-and-internationaization&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.meetup.com/a11ytokyo/events/313272227/?utm_version=v2&quot;&gt;A11y Tokyo Meetup: Accessibility and Internationaization&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Tuesday, Feb 17 · 11:30 AM to 1:00 PM CET&lt;/p&gt;
&lt;p&gt;How does accessibility and internationalisation fit together?&lt;/p&gt;
&lt;p&gt;Why does one need the other, how do they relate, what does this all mean in real life and what can we do in practice? The talk is about how internationalisation and accessibility belong together and how considering internationalisation can improve products in general and provide a good access point to create more accessible products.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;rbi-amp-sebi-digital-accessibility-mandates-why-2026-is-a-compliance-inflection-point-for-india-s-financial-services&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://accessibility.deque.com/rbi-sebi-digital-a11y-mandates&quot;&gt;RBI &amp;amp; SEBI Digital Accessibility Mandates: Why 2026 Is a Compliance Inflection Point for India’s Financial Services&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Wednesday, 18 February | 12:00 - 1:00 PM (IST)&lt;/p&gt;
&lt;p&gt;As RBI and SEBI place stronger emphasis on inclusive and accessible digital experiences, many banks, NBFCs, fintechs, and market participants are asking the same questions: Which guidelines apply to us? Where are the real risks? And how do we move forward without disrupting business priorities?&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;zero-project-conference-2026&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.youtube.com/zeroprojectorg&quot;&gt;Zero Project Conference 2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Wednesday 18th to Friday 20th&lt;/p&gt;
&lt;p&gt;Live content from #ZeroCon26 will be streamed in an accessible manner via the conference platform and the Zero Project's YouTube channel. Session recordings will be made available after the conference.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;axe-con-2026&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.deque.com/axe-con/schedule/&quot;&gt;Axe-Con 2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Tuesday, February 24, through Wednesday, February 25, 2026&lt;/p&gt;
&lt;p&gt;Topics of focus will include accessibility in development, accessibility in design, organizational success with accessibility, and a wildcard track. Talks at Axe-con will include case studies from enterprise companies leading in large-scale accessibility efforts, as well as best practices and updates from technology leaders around the world.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;document-accessibility-in-2026&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.eventbrite.co.uk/e/digital-accessibility-experts-live-registration-111949261254&quot;&gt;Document Accessibility in 2026&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Thursday 26 February 4pm UK-time&lt;/p&gt;
&lt;p&gt;Building on previous webinars from 2024 - Creating Accessible Documents – this webinar continues with Hassell Inclusion’s scoped model, by exploring what’s new, what’s changed, and what to prioritise in 2026 in the world of document accessibility.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/11685/accessibility-education-events-in-february-2026</guid>
<pubDate>Sun, 15 Feb 2026 12:05:30 +0000</pubDate>
</item>
<item>
<title>Building Truly Inclusive Interfaces: An Angular Developer's Guide to ARIA</title>
<link>https://coderlegion.com/8097/building-truly-inclusive-interfaces-an-angular-developers-guide-to-aria</link>
<description>&lt;p&gt;Accessibility (often shortened to &lt;strong&gt;a11y&lt;/strong&gt;) isn't just a compliance requirement—it's a critical aspect of modern software development. A well-built interface should be usable by everyone, regardless of disability or the assistive technologies they rely on.&lt;/p&gt;
&lt;p&gt;In the world of Angular, achieving high accessibility standards, especially for complex interactive components, just got significantly easier with the introduction of &lt;strong&gt;Angular Aria&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;what-is-aria-and-why-is-it-essential-&quot;&gt;What is ARIA and Why is it Essential?&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;ARIA (Accessible Rich Internet Applications)&lt;/strong&gt; is a set of attributes that you can add to HTML elements. Its purpose is to define ways to make web content and web applications, especially those developed with JavaScript, more accessible to people with disabilities.&lt;/p&gt;
&lt;p&gt;While standard HTML elements (like &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;input type=&quot;radio&quot;&amp;gt;&lt;/code&gt;) have built-in accessibility, many modern UI patterns (like complex menus, tabs, and grids) are built using generic elements (&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;). ARIA attributes provide the necessary semantic information to assistive technologies (like screen readers) that these generic elements lack.&lt;/p&gt;
&lt;p&gt;However, implementing these W3C Accessibility Guidelines correctly—handling complex keyboard interactions, focus management, and dynamic ARIA attributes—can be a significant and specialized effort.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;introducing-angular-aria-accessible-components-your-way&quot;&gt;Introducing Angular Aria: Accessible Components, Your Way&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Angular Aria&lt;/strong&gt; is a collection of &lt;strong&gt;headless, accessible directives&lt;/strong&gt; designed to simplify the implementation of common WAI-ARIA patterns.&lt;/p&gt;
&lt;p&gt;The term &lt;strong&gt;&quot;headless&quot;&lt;/strong&gt; is key here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;You provide the HTML structure, the CSS styling, and the business logic.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Angular Aria provides the accessibility implementation.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These directives handle all the tedious, error-prone aspects of a11y, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keyboard Interactions:&lt;/strong&gt; Ensuring users can navigate components (e.g., opening a menu with &lt;code&gt;Enter&lt;/code&gt;, navigating options with arrow keys, closing with &lt;code&gt;Escape&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ARIA Attributes:&lt;/strong&gt; Automatically setting and updating necessary attributes like &lt;code&gt;aria-expanded&lt;/code&gt;, &lt;code&gt;aria-selected&lt;/code&gt;, and &lt;code&gt;aria-label&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focus Management:&lt;/strong&gt; Moving focus logically between elements for seamless interaction.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Screen Reader Support:&lt;/strong&gt; Providing clear announcements of a component's state and available options.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm install @angular/aria
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h4 id=&quot;what-s-included-in-angular-aria-&quot;&gt;What's Included in Angular Aria?&lt;/h4&gt;
&lt;p&gt;Angular Aria provides pre-built accessibility logic for a wide range of common UI patterns, organized into three categories:&lt;/p&gt;
&lt;h5 id=&quot;1-search-and-selection&quot;&gt;1. Search and Selection&lt;/h5&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Component &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Description&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Autocomplete&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Text input with filtered suggestions as the user types.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Listbox&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Single or multi-select option lists with keyboard navigation.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Select&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Single-selection dropdown pattern.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Multiselect&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Multiple-selection dropdown pattern with a compact display.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Combobox&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Primitive directive for coordinating a text input with a popup.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h5 id=&quot;2-navigation-and-call-to-actions&quot;&gt;2. Navigation and Call to Actions&lt;/h5&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Component &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Description&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Menu&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Dropdown menus that can include nested submenus and keyboard shortcuts.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Menubar&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Horizontal navigation bar for persistent application menus.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Toolbar&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Grouped sets of controls with logical keyboard navigation.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h5 id=&quot;3-content-organization&quot;&gt;3. Content Organization&lt;/h5&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Component &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Description&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Accordion&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Collapsible content panels (can expand individually or exclusively).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Tabs&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Tabbed interfaces with automatic or manual activation modes.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Tree&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Hierarchical lists with expand/collapse functionality.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Grid&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Two-dimensional data display with cell-by-cell keyboard navigation.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h4 id=&quot;when-to-use-angular-aria-and-when-not-to-&quot;&gt;When to Use Angular Aria (and When Not To)&lt;/h4&gt;
&lt;p&gt;Angular Aria is a powerful tool, but it's not meant to replace every other accessibility solution.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Use Angular Aria When... &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Consider Alternatives When...&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Building a Design System:&lt;/strong&gt; Your team needs accessible implementations that match specific visual standards. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;You Need Pre-Styled Components:&lt;/strong&gt; Use &lt;strong&gt;Angular Material&lt;/strong&gt; or similar libraries if you want components that look complete out-of-the-box.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Custom Branding is Required:&lt;/strong&gt; The interface must match precise design specifications that pre-styled component libraries cannot easily accommodate. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Building Simple Forms:&lt;/strong&gt; Native HTML controls like &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;input type=&quot;checkbox&quot;&amp;gt;&lt;/code&gt; offer built-in, reliable accessibility.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Creating Enterprise Component Libraries:&lt;/strong&gt; You are creating reusable, WCAG-compliant components for multiple applications. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Rapid Prototyping:&lt;/strong&gt; Pre-styled component libraries offer faster initial development time for validating concepts quickly.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;By separating the &lt;strong&gt;accessibility logic&lt;/strong&gt; (Angular Aria) from the &lt;strong&gt;visual presentation&lt;/strong&gt; (your HTML/CSS), Angular empowers developers to build bespoke, beautiful, and completely inclusive components without becoming ARIA experts overnight.&lt;/p&gt;
&lt;p&gt;Start exploring the directives—the &lt;strong&gt;Toolbar&lt;/strong&gt; is an excellent place to begin—and transform your approach to web accessibility today!&lt;/p&gt;
</description>
<category>Web Dev</category>
<guid isPermaLink="true">https://coderlegion.com/8097/building-truly-inclusive-interfaces-an-angular-developers-guide-to-aria</guid>
<pubDate>Tue, 02 Dec 2025 19:09:55 +0000</pubDate>
</item>
<item>
<title>Speed, Reach, Cost: The Triple Win of Web Standards on Blue Beanie Day</title>
<link>https://coderlegion.com/7990/speed-reach-cost-the-triple-win-of-web-standards-on-bluebeanieday</link>
<description>&lt;p&gt;Sunday, November 30th 2025, marks the 18th annual Blue Beanie Day. Okaaaaay, why is this relevant for inclusion? &lt;/p&gt;
&lt;p&gt;Blue Beanie Day reminds us to pay attention to web standards in order to create sites that load faster, reach more users, and cost less to maintain. Accessibility is part of these standards. &lt;/p&gt;
&lt;p&gt;The web was designed with accessibility in mind. &lt;/p&gt;
&lt;p&gt;Exactly 10 years ago, &lt;a rel=&quot;nofollow&quot; href=&quot;https://bluebeanieday.tumblr.com/post/134211730382/ninth-annual-blue-beanie-day&quot;&gt;Tumblr user BlueBeanieDay&lt;/a&gt; posted:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;It’s a thrilling time to create web content and experiences, as more new coders join our ranks, using more new tools and frameworks to create more new kinds of content, experience, and interactivity. But in this environment that moves faster than reason, it’s too easy for our community—and the breathless media that reports on it—to lose sight of vital basics.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Progressive enhancement and accessible, semantic markup aren’t optional extras.&lt;/strong&gt; They’re the foundation of a web that works for all people, of whatever ability, on whatever devices they choose to access it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;All of the above still stands true today. Web design and development have become popular career paths, with many emerging self-taught talents. Being self-taught myself, I know the pros and cons. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pro:&lt;/strong&gt; With no degree or anything to show, you really have to prove your skills through your skills. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Con:&lt;/strong&gt; You only learn what you choose to learn. Many things can slip in between the grooves of your keyboard like crumbs, so close yet always eluding your fingertips. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You don’t learn what you don’t know, and with a severe lack of web accessibility curriculum standardisation, accessibility is unfortunately most often part of this category. &lt;/p&gt;
&lt;p&gt;Even formal education isn’t a guarantee that you will know the basics of accessibility. Luckily, an increasing number of teachers and boot camps make a conscious effort to include web accessibility in their curriculum, but that remains an individual effort.&lt;/p&gt;
&lt;p&gt;So let’s take Blue Beanie Day as an occasion to master the basics.  I know, I know, plain HTML5 is not as sexy as the latest release cutting-edge tech stack (unless your name is &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.matuzo.at/&quot;&gt;Manuel&lt;/a&gt;). But it’s important to understand (and honour) the blueprints today’s web is built on:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The World Wide Web Consortium (W3C), along with other groups and standards bodies, has established technologies for creating and interpreting web-based content. These technologies, which we call “web standards,” are carefully designed to deliver the greatest benefits to the greatest number of web users while ensuring the long-term viability of any document published on the Web. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;Designing and building with these standards simplifies and lowers the cost of production, while delivering sites that are accessible to more people and more types of Internet devices. Sites developed along these lines will continue to function correctly as traditional desktop browsers evolve, and as new Internet devices come to market.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.webstandards.org/about/mission/&quot;&gt;WaSP - The Web Standards Project&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Web Standards are what keep the web usable, independent of browser and device. Not only now but for the next decades to come.&lt;/p&gt;
&lt;h4 id=&quot;digital-accessibility-is-an-integral-part-of-web-standards-&quot;&gt;Digital accessibility is an integral part of web standards.&lt;/h4&gt;
&lt;p&gt;The web was built on the idea that anyone, on any device, should be able to read, navigate, and contribute.&lt;/p&gt;
&lt;p&gt;One of the biggest players in Web Standards today is the &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.w3.org/standards/&quot;&gt;World Wide Web Consortium (W3C)&lt;/a&gt;. That abbreviation rings a bell, right? Maybe because they have published the Web Content Accessibility Guidelines (WCAG) since 1999. Now we are feverishly anticipating version 3.0, growing from the original 14 guidelines to 85 success criteria grouped into 13 guidelines. &lt;/p&gt;
&lt;h4 id=&quot;take-the-blue-beanie-as-a-reminder-to-start-small-but-think-big-&quot;&gt;Take the blue beanie as a reminder to start small, but think big.&lt;/h4&gt;
&lt;p&gt;Today, spend a few minutes checking one of your own pages with an accessibility tester (&lt;a rel=&quot;nofollow&quot; href=&quot;https://wave.webaim.org/&quot;&gt;WAVE&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; href=&quot;https://chromewebstore.google.com/detail/lhdoppojpmngadmnindnejefpokejbdd?utm_source=item-share-cb&quot;&gt;axe dev tools&lt;/a&gt;, or &lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.chrome.com/docs/lighthouse/&quot;&gt;Google Lighthouse&lt;/a&gt;). Fix the most obvious issues: missing image descriptions, hierarchical heading order, and sufficient colour contrast. Then share what you learned on social media with the hashtag #BlueBeanieDay. By turning a single day into a habit, we keep web standards alive for the next generation of developers and designers.&lt;/p&gt;
&lt;h3 id=&quot;blue-beanie-day-resources&quot;&gt;Blue Beanie Day Resources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.w3.org/developers/&quot;&gt;Resources for Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.webstandards.org/about/mission/&quot;&gt;WaSP Web Standards Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.w3.org/standards/&quot;&gt;Web Standards by W3C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.w3.org/WAI/fundamentals/&quot;&gt;Accessibility Fundamentals by W3C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Designing_with_Web_Standards&quot;&gt;Designing with Web Standards&lt;/a&gt;, the book that started it all.&lt;/li&gt;
&lt;li&gt;The original Jeffrey Zeldman also has a handy dandy post on &lt;a rel=&quot;nofollow&quot; href=&quot;https://zeldman.com/2024/11/30/how-to-join-blue-beanie-day-wear-and-share/&quot;&gt;How to join Blue Beanie Day&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Blue Beanie Day on Tumblr: &lt;a rel=&quot;nofollow&quot; href=&quot;https://bluebeanieday.tumblr.com/&quot;&gt;#a11y is code for “Love Your Neighbor”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Web Dev</category>
<guid isPermaLink="true">https://coderlegion.com/7990/speed-reach-cost-the-triple-win-of-web-standards-on-bluebeanieday</guid>
<pubDate>Sun, 30 Nov 2025 10:31:22 +0000</pubDate>
</item>
<item>
<title>When ‘It Works’ Isn’t Enough: How a Blind Hackerspace Session Exposed Flaws in UX</title>
<link>https://coderlegion.com/7129/when-it-works-isnt-enough-how-a-blind-hackerspace-session-exposed-flaws-in-ux</link>
<description>&lt;p&gt;Recently, I visited my local hackerspace for the “Do it Blind” meetup. Do it Blind is the in-house effort to make the hackerspace itself accessible for people with visual impairments.&lt;/p&gt;
&lt;p&gt;My friend, who had invited me, was trying out how far he could get in the 3D printing process without any sighted assistance, only using his screen reader. While my holographic Eevee coin was printing, I followed along (minus the screen reader, plus the visuals) while he installed OctoPrint on Windows (which seems worth mentioning because the Linux users in the hackerspace believed it impossible).&lt;/p&gt;
&lt;p&gt;I want to say “it worked”, but it would be more accurate to say “he made it work”.&lt;/p&gt;
&lt;p&gt;There was a sign-up form with no form labels and a link instead of a button. Sure, with context clues, it’s kinda obvious what 3 consecutive text input fields would want you to enter: A username, a password, and password confirmation.&lt;/p&gt;
&lt;p&gt;But the ultimate knock-out: a modal window with 2 options to close it, but neither was present on keyboard navigation. There was no way to get past it without using the mouse.&lt;/p&gt;
&lt;p&gt;Regardless of the &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.w3.org/TR/WCAG22/#keyboard&quot;&gt;2.1.1 keyboard navigation&lt;/a&gt; failure, this setup flow was far from accessible. The whole point of this experiment was to find out if the 3D printing process can be done with only a screen reader and a lot of dedication. But not all assistive tech users are power users like that.&lt;/p&gt;
&lt;h3 id=&quot;web-accessibility-best-practices-focus-on-assistive-tech-power-users-&quot;&gt;Web accessibility best practices focus on assistive tech power users.&lt;/h3&gt;
&lt;p&gt;Maybe the aforementioned Linux users in attendance were already a clue, but generally speaking, the digital literacy (and 3D printing knowledge) inside a hackerspace is significantly higher than what you find in the average population.&lt;/p&gt;
&lt;p&gt;Unlabelled forms and overlay-window softlocks are not uncommon issues - still, in the year of 2025 - and not only screen reader users but assistive tech users all over the world are left with no other option than to make it work. Somehow.&lt;/p&gt;
&lt;h3 id=&quot;dark-souls-level-user-experience&quot;&gt;Dark Souls Level User Experience&lt;/h3&gt;
&lt;p&gt;Again: circling back to Dark Souls. If you don’t know it, all you really need to know about it is that this game is notoriously hard to beat. Which is why I like to call user flows that are “accessible/compliant in theory” Dark Souls UX.&lt;/p&gt;
&lt;p&gt;I have compared using assistive tech to Dark Souls before, and I will say it again: Just because it is possible to do something with assistive tech does not mean that most users will have the nerve to complete it. Yet most accessibility evaluations only look at what’s possible for users with substantial digital skills. Just because your accessibility auditor, another power user who knows the differences between NVDA and JAWS in their sleep, can navigate the page just fine, does not mean all other screen reader users will.&lt;/p&gt;
&lt;p&gt;Yes, you can get through it. You can make it work.&lt;/p&gt;
&lt;p&gt;But at what cost?&lt;/p&gt;
&lt;h3 id=&quot;good-experience-or-just-experience-&quot;&gt;Good Experience or Just… Experience?&lt;/h3&gt;
&lt;p&gt;&quot;For the love of users, stop calling it a good experience if not everyone gets to have it.&quot; - &lt;a rel=&quot;nofollow&quot; href=&quot;https://a11ynews.substack.com/p/no-accessibility-no-ux-by-julia-undeutsch&quot;&gt;Julia Undeutsch&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Assistive tech users just don’t receive the same amount of love when it comes to user flow design.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;But why aren’t hoverstates designed to delight keyboard navigation users?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Why isn’t microcopy written to seamlessly guide screen reader users through the flow?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Why don’t brand guidelines include instructions on how to write descriptive alt text in line with the tone of voice?&lt;/p&gt;
&lt;p&gt;Accessibility is mostly regarded through the technical lens, not the human one. This makes it all too easy to forget that behind all those standards, regulations, and requirements is nothing but a person trying to make it work with their setup.&lt;/p&gt;
</description>
<category>Frontend Dev</category>
<guid isPermaLink="true">https://coderlegion.com/7129/when-it-works-isnt-enough-how-a-blind-hackerspace-session-exposed-flaws-in-ux</guid>
<pubDate>Mon, 10 Nov 2025 15:13:09 +0000</pubDate>
</item>
<item>
<title>Upcoming Accessibility Education Events in November 2025</title>
<link>https://coderlegion.com/7039/upcoming-accessibility-education-events-in-november-2025</link>
<description>&lt;h3 id=&quot;the-state-of-accessibility-in-wordpress&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://wpcampus-org.zoom.us/webinar/register/8517600114996/WN_QD246GTVQ6WakJHwd4RMSQ#/registration&quot;&gt;The State of Accessibility in WordPress&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Thursday, November 6, starting 04:00 PM CET&lt;/p&gt;
&lt;p&gt;Join the WPCampus community on Thursday, November 6 at 10 a.m. Eastern (UTC -5) for a focused two-hour event exploring the current and future state of accessibility in WordPress through the lens of higher education.&lt;/p&gt;
&lt;p&gt;They bring together accessibility leaders, developers, and governance practitioners for a series of sessions that connect insight to action: understanding where accessibility in WordPress stands today, how to build stronger governance structures, and what new tools are emerging to make accessibility testing more seamless and integrated.&lt;/p&gt;
&lt;p&gt;Visit &lt;a rel=&quot;nofollow&quot; href=&quot;https://wpcampus.org/events/&quot;&gt;WPCampus.org/events&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h3 id=&quot;getting-tables-right-clear-accessible-and-effective&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://stiftelsenfunka.org/whats-up/free-friday-webinars/getting-tables-right-clear-accessible-and-effective/&quot;&gt;Getting tables right: Clear, accessible, and effective&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Friday, November 7, from 1:30 PM to 2 PM CET&lt;/p&gt;
&lt;p&gt;After the popular webinar on charts, Funka Foundation will now focus on tables. How do they work for people with different user needs? What are the main things to pay attention to? What are the main challenges? Join for an overview from the user perspective and some practical tips.&lt;/p&gt;
&lt;h3 id=&quot;world-usability-day-2025-emerging-technologies-and-human-experience-livestream&quot;&gt;World Usability Day 2025: &lt;a rel=&quot;nofollow&quot; href=&quot;https://wud.accessibilityfirst.at/&quot;&gt;Emerging Technologies and Human Experience Livestream&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Thursday, November 13, 6 PM to 8:30 PM CET&lt;/p&gt;
&lt;p&gt;Talks and panel discussion on accessibility considerations through augmented reality, mobile app development, AI as assistive tech, and alternative interface design.&lt;/p&gt;
&lt;p&gt;All events listed on &lt;a rel=&quot;nofollow&quot; href=&quot;https://worldusabilityday.org/#upcoming-events&quot;&gt;WorldUsabilityDay.org&lt;/a&gt;&lt;/p&gt;
</description>
<category>Augmented Reality</category>
<guid isPermaLink="true">https://coderlegion.com/7039/upcoming-accessibility-education-events-in-november-2025</guid>
<pubDate>Wed, 05 Nov 2025 07:42:02 +0000</pubDate>
</item>
<item>
<title>AccessFix</title>
<link>https://coderlegion.com/7035/accessfix</link>
<description>&lt;p&gt;A few months ago, I was reading through accessibility reports for one of my projects and realized how tedious and inconsistent most a11y tools feel — either too technical for non-specialists or too shallow for developers.&lt;/p&gt;
&lt;p&gt;That’s when I started building AccessFix, a developer-first accessibility checker that makes finding (and fixing) accessibility issues as easy as running a linter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The goal:&lt;/strong&gt;&lt;br&gt;
Make accessibility scanning fast, actionable, and part of every developer’s normal workflow — not an afterthought.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How It Works&lt;/strong&gt;&lt;br&gt;
AccessFix runs scans using axe-core, the industry-standard open-source accessibility engine.&lt;/p&gt;
&lt;p&gt;You can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upload your HTML file&lt;/li&gt;
&lt;li&gt;Paste a website link&lt;/li&gt;
&lt;li&gt;Or connect your GitHub repository&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Once scanned, AccessFix gives you:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A score (based on detected issues)&lt;/li&gt;
&lt;li&gt;A downloadable report — written in plain English for quick fixes&lt;/li&gt;
&lt;li&gt;An optional GitHub Pull Request — it auto-comments on lines with detected issues so your team can fix them inline&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All runs happen in your browser or via GitHub integration — no setup needed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;axe-core Integration — industry-grade accessibility checks&lt;/li&gt;
&lt;li&gt;Scoring System — quickly gauge overall accessibility health&lt;/li&gt;
&lt;li&gt;Downloadable Reports — shareable summaries in plain English&lt;/li&gt;
&lt;li&gt;GitHub PR Generation — automatic inline comments for issues&lt;/li&gt;
&lt;li&gt;Multi-Input Scanning — upload files, enter URLs, or scan repos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(More features like CI/CD integration, AI integration, color analysis, and advanced scoring are coming soon!)&lt;/p&gt;
&lt;p&gt; Sneak Peek&lt;br&gt;
&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=16663755008909954811&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt; Demo video (30s)  &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.youtube.com/watch?v=Vd1v2ZUUwCI&quot;&gt;AccessFix Demo Video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; How Others Can Get Involved&lt;/p&gt;
&lt;p&gt;We’re looking for early testers and developers interested in shaping accessibility tools that actually fit into real workflows.&lt;/p&gt;
&lt;p&gt; Feedback I’m Looking For&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What would make you actually use AccessFix regularly?&lt;/li&gt;
&lt;li&gt;Any feature you wish existed in accessibility tooling?&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Dev Tools</category>
<guid isPermaLink="true">https://coderlegion.com/7035/accessfix</guid>
<pubDate>Wed, 05 Nov 2025 01:00:25 +0000</pubDate>
</item>
<item>
<title>Your summary of upcoming accessibility education events in October 2025</title>
<link>https://coderlegion.com/5835/your-summary-of-upcoming-accessibility-education-events-in-october-2025</link>
<description>&lt;h3 id=&quot;wordpress-accessibility-meetup&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://us02web.zoom.us/webinar/register/5917550928532/WN_pFsYqJqrTJyG5lvYe8xdog#/registration&quot;&gt;WordPress Accessibility Meetup&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Thursday, October 2 at 10 AM Central&lt;/p&gt;
&lt;p&gt;It can be a struggle to convince your client to put in the effort and also conform to any regulation, like Section 508, the EU Accessibility Act, or otherwise. Drawing from her own experience with &quot;difficult&quot; clients and some basic psychology, Annelies Verhelst will provide you with compelling arguments and advice on how to make a business case.&lt;/p&gt;
&lt;h3 id=&quot;funka-foundation-friday-webinar-cybersecurity-accessibility-true&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://us06web.zoom.us/webinar/register/WN_0GwWshzNSOyJsXYMUmtP0w#/registration&quot;&gt;Funka Foundation Friday Webinar: Cybersecurity + Accessibility = True&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Friday, 3 October, 13.30-14.00 CEST&lt;/p&gt;
&lt;p&gt;Cybersecurity and accessibility are both critical for resilient digital infrastructures. This webinar explains how accessibility requirements are integrated with modern cybersecurity measures. Together, they form robust and inclusive standards that support the Cyber Resilience Act.&lt;/p&gt;
&lt;h3 id=&quot;wagtail-space&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://wagtail.org/wagtail-space-2025/&quot;&gt;Wagtail Space&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Wednesday, October 8th - Friday, October 10th&lt;/p&gt;
&lt;p&gt;Come join educators, publishing professionals, developers, open source enthusiasts, and leaders from organizations around the globe for three days of talks and networking. &lt;/p&gt;
&lt;h3 id=&quot;wordpress-accessibility-day&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://2025.wpaccessibility.day/schedule/&quot;&gt;WordPress Accessibility Day&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Wednesday, October 15th - Thursday, October 16th&lt;/p&gt;
&lt;p&gt;WordPress Accessibility Day is a 24-hour global event dedicated to promoting and learning website accessibility best practices for WordPress websites.&lt;/p&gt;
</description>
<category>Networking</category>
<guid isPermaLink="true">https://coderlegion.com/5835/your-summary-of-upcoming-accessibility-education-events-in-october-2025</guid>
<pubDate>Wed, 01 Oct 2025 11:52:09 +0000</pubDate>
</item>
<item>
<title>Differences and stats for screen reader testing.</title>
<link>https://coderlegion.com/5579/differences-and-stats-for-screen-reader-testing</link>
<description>&lt;h2 id=&quot;online-navigation&quot;&gt;Online Navigation&lt;/h2&gt;
&lt;p&gt;Online navigation works quite similarly to offline navigation, only the tools differ greatly. For online navigation, we mainly have zoom, screen magnifiers, and screen readers (or SR for short). Zoom and screen magnifiers are pretty easy to wrap your head around, either because you tested it on purpose or accidentally hit Ctrl while trying to scroll and got a jump scare by gigantic UI elements: They make things big. Checks out.&lt;/p&gt;
&lt;p&gt;But screen readers are more intimidating at first. You boot them up and suddenly everything starts talking! Most of us are not particularly fond of their device issuing unexpected noises because it’s usually a bad thing.&lt;/p&gt;
&lt;p&gt;While text-to-speech (or TTS for short) is the intended functionality of text-to-speech screen readers (shocking, I know), it is overwhelming at first. Monotone, technical-sounding voices are simply not a joy to listen to, especially when you have to concentrate on understanding what exactly these voices are describing to you. On another note: Braille displays peacefully coexist with TTS screen readers and are a staple for web access!&lt;/p&gt;
&lt;p&gt;It’s time to talk about the oh-so-dreaded screen reader testing! &lt;/p&gt;
&lt;h2 id=&quot;screen-reader-output&quot;&gt;Screen Reader Output&lt;/h2&gt;
&lt;p&gt;So screen readers read what’s on the screen? Wrong! They read what you wrote into your code! While a software tester who uses a mouse and screen might not notice that your menu exit button is actually a styled div, the SR will. And it will not work as well.&lt;/p&gt;
&lt;p&gt;This is where the accessibility tree comes into play. The accessibility tree is how SR and other assistive tech users navigate through a website, climbing along heading levels and structures to find the desired information. The accessibility tree is sprouted by the browser based on the DOM (shorthand for Document Object Model) tree and accessed by platform-specific Accessibility APIs.&lt;/p&gt;
&lt;p&gt;The DOM tree contains objects representing all the markup’s elements, attributes, and text nodes. This is precisely why following the h1, h2, h3 … heading structure is important. When you skip heading levels, you cut off the branches that assistive tech needs for a sound climbing route.&lt;/p&gt;
&lt;h3 id=&quot;example&quot;&gt;Example&lt;/h3&gt;
&lt;p&gt;But not all screen readers are the same. Let’s briefly go over the differences in screen reader output: Below are 2 popular screen readers reading the same thing in the same browser and both outputting something different. Feel free to copy the code, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.nvaccess.org/download/&quot;&gt;download NVDA&lt;/a&gt; and follow along. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=9743866561654982874&quot; alt=&quot;Starter Pokemon Table&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;testing-setup&quot;&gt;Testing setup&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;NVDA 2024.1.0.31547 in Chrome v126.0.6478.127 on Windows 11 Enterprise&lt;/li&gt;
&lt;li&gt;JAWS 2022.2204.20.400 in Chrome v126.0.6478.127 on Windows 11 Enterprise&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;the-html&quot;&gt;The HTML&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;table&amp;gt;
&amp;lt;caption&amp;gt;Choose your Starter Pokemon?&amp;lt;/caption&amp;gt;
&amp;lt;tr&amp;gt;
  &amp;lt;th&amp;gt;Person&amp;lt;/th&amp;gt;
  &amp;lt;th&amp;gt;Pokemon&amp;lt;/th&amp;gt;
  &amp;lt;th&amp;gt;Type&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
  &amp;lt;th&amp;gt;Julia&amp;lt;/th&amp;gt;
  &amp;lt;td&amp;gt;Pikachu&amp;lt;/td&amp;gt;
  &amp;lt;td&amp;gt;Electro&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
  &amp;lt;th&amp;gt;Laura&amp;lt;/th&amp;gt;
  &amp;lt;td&amp;gt;Eevee&amp;lt;/td&amp;gt;
  &amp;lt;td&amp;gt;Normal&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
  &amp;lt;th&amp;gt;Audience&amp;lt;/th&amp;gt;
  &amp;lt;td&amp;gt;Magikarp&amp;lt;/td&amp;gt;
  &amp;lt;td&amp;gt;Water&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3 id=&quot;the-css&quot;&gt;The CSS&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;table {
  font-size: 1.5rem;
  margin: 50px;
  min-height: 200px;
  min-width: 500px;
}

tr:first-child &amp;gt; th {
  background-color: lightblue;
  border-bottom: 1px solid darkblue;
}

td {
  text-align: center;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NVDA will say:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“Choose your Starter Pokémon Table with 4 rows and 3 columns Choose&lt;br&gt;
your Starter Pokémon caption”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;and JAWS will say:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“Table with 4 rows and 3 columns Choose your Starter Pokémon”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Same table, same code, same browser, yet 2 different outputs. That doesn’t mean that one is better than the other; they both get the job done. But be aware that there are some nuances between them.&lt;/p&gt;
&lt;h3 id=&quot;then-what-screen-reader-setup-is-best-for-testing-&quot;&gt;Then what Screen Reader Setup is best for Testing?&lt;/h3&gt;
&lt;p&gt;Classic UX answer: it depends. Firstly, on your target demographic, but more tangibly, on the operating systems you are developing for. Every year, WebAIM releases a survey for screen reader users where they ask which SR-browser combination they use.&lt;/p&gt;
&lt;p&gt;The latest survey was conducted between December 2023 and January 2024. Go check the &lt;a rel=&quot;nofollow&quot; href=&quot;https://webaim.org/projects/screenreadersurvey10/&quot;&gt;Screen Reader User Survey #10 Results&lt;/a&gt;! While you’re at it, check out the &lt;a rel=&quot;nofollow&quot; href=&quot;https://webaim.org/projects/million/&quot;&gt;WebAIM Million report&lt;/a&gt; as well. The Million report audited 1 million websites to give us a benchmark of progress in web accessibility over the years and the most common WCAG failures. (It’s still low contrast btw.)&lt;/p&gt;
&lt;h2 id=&quot;screen-reader-testing-summary-&quot;&gt;Screen Reader Testing Summary:&lt;/h2&gt;
&lt;p&gt;JAWS and NVDA came out on top with 40.5% and 37.7% respectively. The 3rd place on the podium took VoiceOver with 9.7%. As for browsers, the big 3 are Google Chrome, Microsoft Edge, and Mozilla Firefox.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=5221347027132859011&quot; alt=&quot;results for primary desktop or laptop screen reader use&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=17949134077682452036&quot; alt=&quot;results for browser usage with primary screen reader&quot;&gt;&lt;/p&gt;
</description>
<category>QA Best Practices</category>
<guid isPermaLink="true">https://coderlegion.com/5579/differences-and-stats-for-screen-reader-testing</guid>
<pubDate>Thu, 25 Sep 2025 13:34:22 +0000</pubDate>
</item>
<item>
<title>Hello World! Welcome to the Accessibility Group!</title>
<link>https://coderlegion.com/5531/hello-world-welcome-to-the-accessibility-group</link>
<description>&lt;h2 id=&quot;hello-world-welcome-to-the-accessibility-group-&quot;&gt;Hello World! Welcome to the Accessibility  Group!&lt;/h2&gt;
&lt;p&gt;We’re excited to have you here! This is a space where you can share, learn, and connect with other developers who love Accessibility.&lt;/p&gt;
&lt;h3 id=&quot;start-by-saying-hi-&quot;&gt;Start by saying hi!&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Introduce yourself in the comments below&lt;/strong&gt;—tell us your name, what you’re working on, or something fun about yourself. We’d love to get to know you!&lt;/p&gt;
&lt;p&gt;Once you’ve said hi, you can:&lt;/p&gt;
&lt;p&gt;Share your HTML tips or interesting projects.&lt;/p&gt;
&lt;p&gt;Ask questions and get feedback from the community.&lt;/p&gt;
&lt;p&gt;Comment on and support other members’ posts.&lt;/p&gt;
&lt;p&gt;We’re happy you joined the Accessibility Group and can’t wait to see your contributions. Let’s make this a friendly and helpful place to learn together!&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/5531/hello-world-welcome-to-the-accessibility-group</guid>
<pubDate>Wed, 24 Sep 2025 05:27:05 +0000</pubDate>
</item>
<item>
<title>This is your event summary for upcoming opportunities in accessibility education in September 2025</title>
<link>https://coderlegion.com/5235/this-your-event-summary-upcoming-opportunities-accessibility-education-september-2025</link>
<description>&lt;h3 id=&quot;webaim-conference&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://conference.webaim.org/&quot;&gt;WebAIM Conference&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;September 16-17, from 12:15 PM– 5 PM (US Eastern Time)&lt;/p&gt;
&lt;p&gt;The Web Accessibility in Mind Conference is presented by WebAIM in partnership with Pope Tech. This virtual conference will provide conference participants with content that will help them mature their practice in digital accessibility. Our goals include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provide a diverse range of perspectives from a diverse group of&lt;br&gt;
speakers.&lt;/li&gt;
&lt;li&gt;Share solutions to accessibility challenges.&lt;/li&gt;
&lt;li&gt;Give advice and guidance that helps our participants to actively&lt;br&gt;
contribute to providing more accessible digital spaces.&lt;/li&gt;
&lt;li&gt;Bring together a cross section of public and private sector&lt;br&gt;
technology professionals from organizations large and small.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;google-dev-group-vienna-ama-ask-us-anything-about-accessibility&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://gdg.community.dev/events/details/google-gdg-vienna-presents-ama-ask-us-anything-about-accessibility-2025-09-18/&quot;&gt;Google Dev Group Vienna AMA: Ask Us Anything about Accessibility&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Thursday, September 18, 5:00 – 6:30 PM (GMT+2)&lt;/p&gt;
&lt;p&gt;This session is your chance to ask all your burning questions about accessibility! Whether you're struggling with WCAG guidelines, unsure about best practices, or curious about the latest accessibility tools and techniques, we'll be here to provide answers and share insights. Panelists have backgrounds in software development, product design, UX research, QA engineering, product operations, and every single one brings deep expertise in accessibility.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;inclusive-design-24&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://inclusivedesign24.org/2025/schedule/&quot;&gt;Inclusive Design 24&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Thursday, September 25, all day livestream on &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.youtube.com/inclusivedesign24&quot;&gt;YouTube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Inclusive Design 24 (#id24) is a free 24-hour online event for the global community. It celebrates inclusive design and shares knowledge and ideas from analogue to digital, from design to development, from planners to practitioners, and everything and everyone in between.&lt;/p&gt;
</description>
<category>Mentorship</category>
<guid isPermaLink="true">https://coderlegion.com/5235/this-your-event-summary-upcoming-opportunities-accessibility-education-september-2025</guid>
<pubDate>Mon, 08 Sep 2025 19:46:08 +0000</pubDate>
</item>
<item>
<title>Quick manual testing to cover basic functionalities for accessibility.</title>
<link>https://coderlegion.com/5222/quick-manual-testing-to-cover-basic-functionalities-for-accessibility</link>
<description>&lt;h2 id=&quot;catch-em-all-hunting-accessibility-bugs-like-a-champion-with-manual-testing&quot;&gt;Catch ‘Em All: Hunting Accessibility Bugs Like a Champion with Manual Testing&lt;/h2&gt;
&lt;p&gt;This post is part of a series on web accessibility. Read the first part here: &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/5191/web-accessibility-and-automated-testing-basics-explained-with-pokemon&quot;&gt;Web accessibility and automated testing basics explained with Pokémon&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There will come a point on your path to becoming an A11y Master when you will need to add manual testing to your team. Of course, getting proficient in testing with multiple assistive tech types would be like tapping into the power of Arceus, but you don't need to face legendary battles straight away to evolve your testing skills:&lt;/p&gt;
&lt;h3 id=&quot;magikarp-s-splash-1-tab&quot;&gt;Magikarp’s splash = 1 tab&lt;/h3&gt;
&lt;p&gt;A lot of assistive tech simply simulates inputs through keystrokes. This is not limited to form inputs; keystrokes or combinations are also used to navigate a webpage. Switch buttons work the same. No, not the on/off toggle kind, I’m talking about &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.perkins.org/resource/introduction-7-common-adaptive-switches/&quot;&gt;adaptive switches&lt;/a&gt;. Much like disabilities, they come in a variety of shapes and sizes. They are especially important for people with mobility, flexibility, and body structure disabilities.&lt;/p&gt;
&lt;p&gt;Functional keyboard navigation is also important for screen readers, as they mostly utilize the tab key to jump from one focusable element to the next. That makes the tab key a readily accessible tool to cover a lot of ground with. You can check which elements receive focus, if the focus follows the website structure, if one can interact with elements as expected, and if the focus is visible…&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Like Magikarp's splash, the tab key doesn't do much on its own, but&lt;br&gt;
once you understand how keyboard navigation works, it's a strong&lt;br&gt;
addition to your testing lineup. And just like that, your keyboard&lt;br&gt;
evolves into your very own Gyarados.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;eevee-screen-readers&quot;&gt;Eevee = Screen Readers&lt;/h3&gt;
&lt;p&gt;The normal type Eevee is not only cute but very versatile, just like the wide range of screen reader software available!&lt;/p&gt;
&lt;p&gt;Screen readers also include the often-forgotten Braille display. Yes, it counts as a screen reader too! The only difference is that it doesn’t output in speech but translates the written text to Braille code instead.&lt;/p&gt;
&lt;h3 id=&quot;eeveelutions-amp-different-screen-readers-in-different-browsers&quot;&gt;Eeveelutions &amp;amp; different screen readers in different browsers&lt;/h3&gt;
&lt;p&gt;Just like an Eevee can evolve into different types, different screen readers and browser combinations will give you different outputs. But they all operate on the same foundation, so make sure landmarks and headings are in order, and your images have alt attributes filled with suitable text alternatives, so your Eevees can read every move of their opponent in battle!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=15409826329719153928&quot; alt=&quot;eeveelutions are similar but different, just like screen reader and browser combinations&quot;&gt;&lt;/p&gt;
&lt;p&gt;To build your ultimate screen reader team, check the &lt;a rel=&quot;nofollow&quot; href=&quot;https://webaim.org/projects/screenreadersurvey10/&quot;&gt;WebAIM screen reader user survey&lt;/a&gt; to find the most popular screen reader and browser pairings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Watch out&lt;/strong&gt;: The screen reader survey is not the ultimate representation of which combinations are the most used. The survey is sent out annually by WebAIM, but not every person who relies on it is actively keeping up with web accessibility. Especially persons with lower digital literacy who just started out using a screen reader out of necessity are unlikely to bother filling out a survey about their screen reader use. So don’t forget to test with in-built tools such as Talk Back on Android smartphones as well.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;start-your-adventure&quot;&gt;Start your adventure&lt;/h3&gt;
&lt;p&gt;With a strong team like that, you are well prepared to venture out into the World Wide Web and catch all accessibility bugs you encounter. Accessibility issues around the world are waiting for you!&lt;/p&gt;
</description>
<category>Web Dev</category>
<guid isPermaLink="true">https://coderlegion.com/5222/quick-manual-testing-to-cover-basic-functionalities-for-accessibility</guid>
<pubDate>Sun, 07 Sep 2025 07:16:38 +0000</pubDate>
</item>
<item>
<title>Web accessibility and automated testing basics explained with Pokémon.</title>
<link>https://coderlegion.com/5191/web-accessibility-and-automated-testing-basics-explained-with-pokemon</link>
<description>&lt;h2 id=&quot;catch-em-all-hunting-accessibility-bugs-like-a-champion-with-automated-testing&quot;&gt;Catch ‘Em All: Hunting Accessibility Bugs Like a Champion with Automated Testing&lt;/h2&gt;
&lt;h3 id=&quot;so-you-wanna-be-the-very-best-in-software-testing-like-no-one-ever-was-&quot;&gt;So, you wanna be the very best in software testing, like no one ever was?&lt;/h3&gt;
&lt;p&gt;Testing for access barriers is part of a comprehensive quality assurance process. But where does one start? While the WCAG are as extensive as the Pokédex, what exactly is the assistive tech equivalent of Bulbasaur? Where do you start to catch ‘em all?&lt;/p&gt;
&lt;p&gt;Accessibility is a key part of quality assurance, but navigating the world of accessibility testing tools can feel as overwhelming as choosing your first Pokémon. So, where do you start?&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-wcag-are-your-pok-dex&quot;&gt;The WCAG are your Pokédex&lt;/h3&gt;
&lt;p&gt;How many Pokémon are there? Depends on the edition, but let’s go with the 151 from the 1st generation. How many success criteria are there? 85 in the 2.2 version. Just like Pokémon have their evolutions, success criteria have levels: A, Double A, and Triple A.&lt;/p&gt;
&lt;p&gt;You can think of them as the same thing: each Pokémon starts out at level A, which is its base form. You can’t battle with an egg (unless you’re Misty), and your website needs to pass at least level A to have basic functionality present. The better your website usability gets, the more high-level success criteria you can pass. Like a training montage!&lt;/p&gt;
&lt;p&gt;Not all success criteria are applicable to all websites or apps, but certain criteria are always required, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.1.1 Non-text Content&lt;/li&gt;
&lt;li&gt;1.3.3 Sensory Characteristics&lt;/li&gt;
&lt;li&gt;1.4.1 Use of Color&lt;/li&gt;
&lt;li&gt;2.1.1 Keyboard Operable&lt;/li&gt;
&lt;li&gt;2.1.2 No Keyboard Trap&lt;/li&gt;
&lt;li&gt;2.3.1 Three Flashes or Below Threshold&lt;/li&gt;
&lt;li&gt;2.4.1 Bypass Blocks&lt;/li&gt;
&lt;li&gt;2.4.2 Page Titled&lt;/li&gt;
&lt;li&gt;2.4.3 Focus Order&lt;/li&gt;
&lt;li&gt;2.4.4 Link Purpose (In Context)&lt;/li&gt;
&lt;li&gt;2.5.3 Label in Name&lt;/li&gt;
&lt;li&gt;3.1.1 Language of Page&lt;/li&gt;
&lt;li&gt;3.2.1 On Focus&lt;/li&gt;
&lt;li&gt;3.2.6 Consistent Help (from WCAG 2.2, aka the 4th gen)&lt;/li&gt;
&lt;li&gt;4.1.2 Name, Role, Value&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are the very, very basic requirements for your website, the very first Pokémon you catch on your adventure. Others will also be applicable, depending on the type of content you add, but these guys will be your MVP (minimal viable Pokémon) team to challenge the first gym leader to get your Level A compliance score.&lt;/p&gt;
&lt;p&gt;While some success criteria build on each other, others are stand alone criteria. Like Ditto, Lapras, and your favorite legendary, they are not part of an evolutionary line, but they could be Level A, AA or AAA in their default form.&lt;/p&gt;
&lt;p&gt;So while we can agree that Charmander is cute, ultimately we all want Charizard. In the same way, we shouldn’t be content with simply passing AA. If you want to become an Accessibility Champion, keep evolving and keep striving for AAA.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;pick-your-starter-&quot;&gt;Pick your starter!&lt;/h3&gt;
&lt;p&gt;Now that we’ve collected our WCAG Pokédex and encouraging words from Professor Oak, it’s time to pick a starter and get started with accessibility testing!&lt;/p&gt;
&lt;h3 id=&quot;automated-testing&quot;&gt;Automated Testing&lt;/h3&gt;
&lt;p&gt;Automated testing has come a long way, but it’s not yet good enough for the Champions League. So to become an Accessibility Champion, you need to learn how to pick the right starter testing tools, then, with a few manual testing tips and tricks, plus a training montage, you will be catching accessibility bugs and barriers, like no one ever has! Let’s go meet some starters:&lt;/p&gt;
&lt;h3 id=&quot;pikachu-google-lighthouse&quot;&gt;Pikachu = Google Lighthouse&lt;/h3&gt;
&lt;p&gt;I know Pikachu is as iconic as it can get, all the while, Google Lighthouse has a bad reputation due to a lack of accuracy. But hear me out: Lighthouse isn’t a bad tool. It can teach you a lot, but has its limits, and you won’t be able to challenge the Accessibility Champions League with it alone.&lt;/p&gt;
&lt;p&gt;It suffers from the same problems all automated testing tools have: They can only check what they can check, meaning that they may, for example, state that alt-text is used correctly, even if the string value looks something like “asdfgThisIsGibberishTM_randomStringOfNumbers”. Yes, alt text is technically present, but with content like that, the screen reader might as well be freestyling.&lt;/p&gt;
&lt;p&gt;But the errors it throws up are correct. You will have a straightforward list of what to fix, which makes for an easy starting point.&lt;/p&gt;
&lt;p&gt;Web accessibility is a long road to master, including knowledge of disabilities, assistive tech hardware &amp;amp; software, legal frameworks like the ADA or EAA, stretching all the way to human rights, but every now and then, you will still get stuck on a bridge with niche ARIA labels and the question of what they are compatible with, blocking your way.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=17506872028483276759&quot; alt=&quot;Your player character is trying to progress, but “A Pokémon is sprawled out in deep and comfortable slumber. “ It’s Snorlax.&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;bulbasaur-wave&quot;&gt;Bulbasaur = WAVE&lt;/h3&gt;
&lt;p&gt;WAVE is a web accessibility evaluation tool by WebAIM:&lt;/p&gt;
&lt;p&gt;Rather than providing a complex technical report, WAVE shows your original web content with embedded icons and indicators that reveal the accessibility information within your page. WAVE cannot tell you if your web content is accessible – only a human can determine true accessibility – but WAVE can help you evaluate the accessibility of your web content.&lt;/p&gt;
&lt;p&gt;It is a solid choice when you are starting out, but (like the plant starter in each generation) it also has its weaknesses. For example, Many landing pages use hero images at the top. WAVE doesn’t recognize if the color contrast between the background image and the text in an overlay on top of it is sufficient; all it sees is a textbox with a transparent background, so it will assume that&lt;/p&gt;
&lt;p&gt;What I like most about it is that it lets you reference the relevant part of the source code for each issue. To become an Accessibility Champion, you have to learn how to handle accessibility in code, too. With WAVE, it’s very much a bite-sized introduction to it.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Both tools will point you toward learning resources for the particular errors they recognize. This is what makes them the perfect starter Pokémon: They are easy to use and show you where to go for more training.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/&quot;&gt;WCAG 2.2 Understanding Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://webaim.org/blog/introducing-wave-4/&quot;&gt;WAVE Accessibility Testing Tool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.chrome.com/docs/lighthouse/&quot;&gt;Google Lighthouse Chrome Browser Extension&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Web Dev</category>
<guid isPermaLink="true">https://coderlegion.com/5191/web-accessibility-and-automated-testing-basics-explained-with-pokemon</guid>
<pubDate>Thu, 04 Sep 2025 19:53:24 +0000</pubDate>
</item>
<item>
<title>When we construct the digital world to the limits of the best devices, we build a less usable one.</title>
<link>https://coderlegion.com/1455/when-we-construct-the-digital-world-to-the-limits-the-best-devices-we-build-less-usable-one</link>
<description>&lt;p&gt;The Mobile Performance Inequality Gap&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setting the Benchmarks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Alex Russel, a lead performance developer at Google is a firm believer in “an internet for everyone”. He highlights this in a poignant &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.youtube.com/watch?v=4bZvq3nodf4&quot;&gt;Chrome Dev Summit talk in 2016&lt;/a&gt; where he showed that when we construct the digital world to the limits of the best devices, we build a less usable one for &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.idc.com/promo/smartphone-market-share/os&quot;&gt;80+% of the world’s users&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Since things have changed since 2016, the updated golden web performance standard to achieve now is ~100KiB of HTML/CSS/fonts and ~300-350KiB of JS (gzipped). This rule-of-thumb limit typically lasts about two years and is a hard target to meet. Most modern development tooling easily surpasses this amount in lieu of providing a robust and intuitive developer experience but there is a high cost in doing so if you’re attempting to cater to an international market, as the data suggests.&lt;/p&gt;
&lt;p&gt;Your company’s poor site performance can manifest as lower engagement, higher bounce rates, or a reduction in conversions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Business Impacts&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The harmful business impact of poor performance is constantly re-validated. Big decreases in performance predictably lead to (somewhat lower) decreases in user engagement and conversion. The scale of the effect can be deeply situational or hard to suss out without solid metrics, but it’s there. When doing user research, Google’s Web Team found some interesting patterns:&lt;/p&gt;
&lt;p&gt;Users hate delays and unreliability on mobile: the level of stress caused by mobile delays is  comparable to watching a horror movie .&lt;/p&gt;
&lt;p&gt;Fifty percent of smartphone users are more likely to use a company’s mobile site when browsing or shopping because they  don’t want to download an app .&lt;/p&gt;
&lt;p&gt;One of the top reasons for uninstalling an app is the  limited storage  (whereas an installed PWA usually takes less than 1MB).&lt;/p&gt;
&lt;p&gt;Smartphone users are more likely to purchase from mobile sites that  offer relevant recommendations on products, and 85% of smartphone users say  mobile notifications are useful.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Google's approach to this problem?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;According to those observations, Google found that customers prefer experiences that are fast, installable, reliable, and engaging (F.I.R.E.)! This means companies need to be laser-focused when it comes to performance budgeting. Check out the average device capability worldwide.&lt;/p&gt;
&lt;p&gt;From 2017 data, the default global baseline is a ~$200 Android device on a 400Kbps link with a 400ms round-trip time (“RTT”). This translates into a budget of ~130-170KB of critical-path resources, depending on composition — the more JS you include, the smaller the bundle must be.&lt;/p&gt;
&lt;p&gt;The single most important thing to understand about the landscape of devices your sites will run on is that they are not new phones. Two numbers set the stage:&lt;/p&gt;
&lt;p&gt;45% of  mobile connections occur over 2G worldwide&lt;/p&gt;
&lt;p&gt;75%  of connections occur on either 2G or 3G&lt;/p&gt;
&lt;p&gt;The median user is on a slow network. Just how slow is a matter of some debate.&lt;/p&gt;
&lt;p&gt;This makes some intuitive sense: smartphones are not in their first year (and haven’t been for more than a dozen years), and most users do not replace their devices every year. Most smartphone sales today are replacements (that is, to users who have previously owned a smartphone), and the longevity of devices continues to rise.&lt;/p&gt;
&lt;p&gt;The worldwide device replacement average is  now 33 months . In markets near  smartphone saturation , that means we can expect the median device to be nearly 18 months old.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PWAs leverage modern web capabilities&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;How we can solve this issue of performance inequality? By recognizing the issue within our own products and services and using Progressive Web Applications as a way to overcome some technical obstacles and deliver performative, highly optimized apps quickly and effectively.&lt;/p&gt;
&lt;p&gt;Progressive Web Apps (PWAs) are web apps that use service workers, manifests, and other web-platform features in combination with progressive enhancement to give users an experience on par with native apps.&lt;/p&gt;
&lt;p&gt;PWAs provide a number of advantages to users — including being installable, progressively enhanced, responsively designed, re-engageable, linkable, discoverable, network independent, and secure.&lt;/p&gt;
&lt;p&gt;PWAs are not created with a single technology. They represent a new philosophy for building web apps, involving some specific patterns, APIs, and other features. It's not that obvious if a web app is a PWA or not from first glance. An app could be considered a PWA when it meets certain requirements, or implements a set of given features: works offline, is installable, is easy to synchronize, can send push notifications, etc.&lt;/p&gt;
&lt;p&gt;There are some key principles a web app should try to observe to be identified as a PWA. It should be:&lt;/p&gt;
&lt;p&gt;Discoverable, so the contents can be found through search engines.&lt;/p&gt;
&lt;p&gt;Installable, so it can be available on the device's home screen or app launcher.&lt;/p&gt;
&lt;p&gt;Linkable, so you can share it by sending a URL.&lt;/p&gt;
&lt;p&gt;Network independent, so it works offline or with a poor network connection.&lt;/p&gt;
&lt;p&gt;Progressively enhanced, so it's still usable on a basic level on older browsers, but fully functional on the latest ones.&lt;/p&gt;
&lt;p&gt;Re-engageable, so it's able to send notifications whenever there's new content available.&lt;/p&gt;
&lt;p&gt;Responsively designed, so it's usable on any device with a screen and a browser—mobile phones, tablets, laptops, TVs, refrigerators, etc.&lt;/p&gt;
&lt;p&gt;Secure, so the connections between the user, the app, and your server are secured against any third parties trying to get access to sensitive data.&lt;/p&gt;
&lt;p&gt;Offering these features and making use of all the advantages offered by web applications can create a compelling, highly flexible offering for your users and customers all while keeping the performance inequality gap top of mind.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is it worth doing all that?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Absolutely! With a relatively small amount of effort required to implement the core PWA features, the benefits for people using older and slower devices are huge. For example:&lt;/p&gt;
&lt;p&gt;A decrease in loading times after the app has been installed, thanks to caching with service workers, along with saving precious bandwidth and time. PWAs have near-instantaneous loading (from the second visit).&lt;/p&gt;
&lt;p&gt;The ability to update only the content that has changed when an app update is available. In contrast, with a native app, even the slightest modification can force the user to download the entire application again.&lt;/p&gt;
&lt;p&gt;A look and feel that is more integrated with the native platform—app icons on the home screen or app launcher, applications that automatically run in full-screen mode, etc.&lt;/p&gt;
&lt;p&gt;Re-engaging with users through the use of system notifications and push messages, leading to more engaged users and better conversion rates.&lt;/p&gt;
&lt;p&gt;It's well worth trying out a PWA approach, so you can see for yourself if it works for your app.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Advantages of web applications&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A fully-capable progressive web application should provide all of the following advantages to the user.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Discoverability&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The eventual aim is that web apps should have better representation in search engines, be easier to expose, catalogue and rank, and have metadata usable by browsers to give them special capabilities.&lt;/p&gt;
&lt;p&gt;Some of the capabilities have already been enabled on certain web-based platforms by proprietary technologies like Open Graph, which provides a format for specifying similar metadata in the HTML block using tags.&lt;/p&gt;
&lt;p&gt;The relevant web standard here is the Web app manifest, which defines features of an app such as name, icon, splash screen, and theme colours in a JSON-formatted manifest file. This is for use in contexts such as app listings and device home screens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Installability&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A core part of the web app experience is for users to have app icons on their home screen, and be able to tap to open apps into their native container that feels nicely integrated with the underlying platform.&lt;/p&gt;
&lt;p&gt;Modern web apps can have this native app feel via properties set inside the Web app manifest, and via a feature available in modern smartphone browsers called web app installation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linkability&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One of the most powerful features of the web is the ability to link to an app at a specific URL without the need for an app store or a complex installation process. This is how it has always been.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Network independence&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Modern web apps can work when the network is unreliable, or even non-existent. The basic ideas behind network independence are to be able to:&lt;/p&gt;
&lt;p&gt;Revisit a site and get its contents even if no network is available.&lt;/p&gt;
&lt;p&gt;Browse any kind of content the user has previously visited at least once, even under situations of poor connectivity.&lt;/p&gt;
&lt;p&gt;Control what is shown to the user in situations where there is no connectivity.&lt;/p&gt;
&lt;p&gt;This is achieved using a combination of technologies: Service Workers to control page requests (for example storing them offline), the Cache API for storing responses to network requests offline (very useful for storing site assets), and client-side data storage technologies such as Web Storage and IndexedDB to store application data offline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Progressive enhancement support&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Modern web apps can be developed to provide an excellent experience to fully capable browsers, and an acceptable (although not quite as shiny) experience to less capable browsers. We've been doing this for years with best practices such as progressive enhancement. By using progressive enhancement, PWAs are cross-browser. This means developers should take into account the differences in the implementation of some PWA features and technologies between different browser implementations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Re-engage ability&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One major advantage of native platforms is the ease with which users can be re-engaged by updates and new content, even when they aren't looking at the app or using their devices. Modern web apps can now do this too, using new technologies such as Service Workers for controlling pages, the Web Push API for sending updates straight from server to app via a service worker, and the Notifications API for generating system notifications to help engage users when they're not actively using their web browser.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Responsiveness&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Responsive web apps use technologies like media queries and viewport to make sure that their UIs will fit any form factor: desktop, mobile, tablet, or whatever comes next.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Secure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The web platform provides a secure delivery mechanism that prevents snooping while simultaneously ensuring that content hasn’t been tampered with, as long as you take advantage of HTTPS and develop your apps with security in mind.&lt;/p&gt;
&lt;p&gt;It's also easy for users to ensure that they're installing the right app because its URL will match your site's domain. This is very different from apps in app stores, which may have several similarly-named apps, some of which may even be based on your site, which only adds to the confusion. Web apps eliminate that confusion and ensure that users get the best possible experience.&lt;/p&gt;
</description>
<category>Web Dev</category>
<guid isPermaLink="true">https://coderlegion.com/1455/when-we-construct-the-digital-world-to-the-limits-the-best-devices-we-build-less-usable-one</guid>
<pubDate>Thu, 13 Mar 2025 20:14:34 +0000</pubDate>
</item>
</channel>
</rss>