Real talk: Web apps don't need semantics

2 minutes read

I've heard this one a few times, usually in combination with the framework excuse from last week. It comes in a few variations, but the gist of it is the same.

You have a "modern single page app" that's dynamic and meant to look and feel like a "desktop app." Your "app" relies on a fancy framework, has built-in state management and a fancy router that makes it accessible at one URL. It all looks dynamic because the router swaps part of your page content around, so you don't feel a page reload.

I won't get into the usefulness of these single page apps (SPA). I will say that semantic HTML is not reserved for blogs. Your garden variety of "web apps" still need to comply.

That's because your SPA is still a webpage. It's built on HTML, not magic. And when your framework vomits out a div monstrosity instead of proper structure, you're not "innovating" anything.

Screen readers don't give a shit about your framework. They read HTML. If your "app" is a nest of divs, congrats to you! You built a maze with no exits.

Just because your content loads asynchronously doesn't mean you get to skip headings, lists or buttons. Can keyboard users navigate it? No? Then it's half-built, half BS. Dynamic doesn't mean broken.

The web is inherently semantic. Browsers, assistive tech and search engines rely on structure.

If your "web app" can't handle basic semantics, it's not an app. It's a liability. Stop hiding behind frameworks and learn the damn platform. I don't care if you're creating a "desktop app."

Your "desktop app" still needs to be accessible. That's because desktop apps need to be accessible as well. So there goes your excuse!

Sent on

Did you enjoy this bite-sized message?

I send out short emails like this every day to help you gain a fresh perspective on accessibility and understand it without the jargon, so you can build more robust products that everyone can use, including people with disabilities.

You can unsubscribe in one click and I will never share your email address.