{"id":98056,"date":"2026-10-09T15:02:00","date_gmt":"2026-10-09T19:02:00","guid":{"rendered":"https:\/\/overcentral.com\/en\/?p=98056"},"modified":"2026-09-29T08:04:15","modified_gmt":"2026-09-29T12:04:15","slug":"emdash-accessibility-review-98056","status":"publish","type":"post","link":"https:\/\/overcentral.com\/en\/emdash-accessibility-review-98056\/","title":{"rendered":"EmDash Accessibility: What Ships and What Doesn\u2019t"},"content":{"rendered":"<p>Cloudflare\u2019s new CMS, EmDash, launched as a v0.1.0 developer preview. That matters for accessibility. Because what ships today\u2014and what doesn\u2019t\u2014tells you whether this thing was built for real users or just for the demo.<\/p>\n<p>Let\u2019s walk through it feature by feature.<\/p>\n<h2>Built-In: Passkey Authentication<\/h2>\n<p>EmDash ships with WebAuthn passkeys as the default login method. No passwords to leak. No brute-force vectors. For users who rely on screen readers, this eliminates a whole category of login friction.<\/p>\n<p>But here\u2019s the catch. The passkey flow relies on browser-level WebAuthn dialogs. Those dialogs are accessible\u2014they\u2019re part of the browser chrome, not the page. But the fallback, a magic link sent via email, returned a \u201cpage not found\u201d error on at least one Linux setup during beta testing. If that fallback fails, an assistive-tech user on a non-standard browser is locked out entirely.<\/p>\n<h2>Built-In: Theme and Color Mode Support<\/h2>\n<p>Every starter template\u2014blog, marketing site, portfolio\u2014ships with light, dark, and system mode. That\u2019s three color schemes out of the box. The admin panel also toggles between light and dark via a button in the sidebar.<\/p>\n<p>What\u2019s less clear is contrast ratio. The default theme uses a white background with black text, which passes WCAG AA. But the admin sidebar, with its gray-on-gray labels in collapsed mode, dips below that threshold. A user with low vision would need to squint at the navigation icons.<\/p>\n<h2>Built-In: Structured Content via Portable Text<\/h2>\n<p>EmDash stores rich content as portable text\u2014structured JSON, not raw HTML. That\u2019s a win for assistive tech. Screen readers can parse semantic blocks (headings, lists, images with alt text) without wading through div soup.<\/p>\n<p>But portable text is only as good as the editor that produces it. The default block editor has no built-in heading level validation. A content editor can skip from H2 to H4 without an H3, and the system won\u2019t flag it. That\u2019s a WCAG 1.3.1 violation waiting to happen on every post.<\/p>\n<h2>Built-In: Front-End Editor<\/h2>\n<p>Clicking \u201cedit\u201d on a published page drops you into a live editing mode. The edit button itself is a small text link at the bottom of the page\u2014not a visible, high-contrast control. A keyboard-only user tabbing through the page would need 15+ stops to reach it, depending on content length.<\/p>\n<p>The editor overlay itself lacks a visible focus ring on several block types. <a href=\"https:\/\/overcentral.com\/en\/eu-cra-reporting-requirements-80362\/\" title=\"EU CRA Demands What Shipped and When You Knew\" data-iacss-internal=\"1\">When you<\/a> tab into an image block, the selection outline disappears. A user navigating by keyboard alone can\u2019t tell where their cursor landed.<\/p>\n<h2>What\u2019s Missing: Keyboard Navigation in the Admin<\/h2>\n<p>The admin panel relies heavily on hover states. Dropdown menus in the sidebar expand on mouseover. A keyboard user pressing Tab through the menu items lands on each top-level link but never sees the sub-items beneath it. The sub-menus require an explicit Enter press to expand\u2014if you know to try. There\u2019s no visual hint that sub-items exist.<\/p>\n<p>This isn\u2019t a minor polish issue. It\u2019s a WCAG 2.1.1 failure. A developer building a client site on EmDash would need to patch the admin theme themselves, assuming they have access to modify it.<\/p>\n<h2>What\u2019s Missing: ARIA Labels on Dynamic Content<\/h2>\n<p>The notification toast that appears after saving a post has no <code>role=\"alert\"<\/code>codecode or <code>aria-live<\/code>codecode region. A screen reader user hears nothing. The post saves silently. They have to navigate back to the post list to confirm the draft was published.<\/p>\n<p>The media library modal has a close button with an X icon and no <code>aria-label<\/code>codecode. A screen reader announces \u201cbutton\u201d with no context. A user who can\u2019t see the screen doesn\u2019t know what that button does.<\/p>\n<h2>What\u2019s Missing: Focus Management After Actions<\/h2>\n<p>When you delete a comment from the moderation queue, focus resets to the top of the page. A keyboard user gets thrown back to the start. They have to tab all the way down to the queue again to continue moderating. WordPress handles this better\u2014it returns focus to the next item in the list.<\/p>\n<p>This pattern repeats across the admin. After publishing a post, focus jumps to the post list header. After saving a content type, focus lands on a random element. The experience feels disjointed for anyone not using a mouse.<\/p>\n<h2>The Problem No One\u2019s Talking About<\/h2>\n<p>Here\u2019s the specific failure scenario I want you to consider. An agency builds a client site on EmDash. The client employs a content editor who uses a screen reader. The editor needs to create a new custom content type\u2014say, \u201cCase Studies\u201d\u2014with five custom fields. In the admin, they navigate to Content Types, click \u201cCreate New,\u201d and fill out the form.<\/p>\n<p>The form has no error announcement for required fields. If they skip the slug field and try to save, the page refreshes with no audible cue. The field turns red, but the screen reader doesn\u2019t announce it. The editor doesn\u2019t know the save failed. They try again. Same result. After three attempts, they assume the CMS is broken and log a support ticket.<\/p>\n<p>The agency developer investigates. They discover the form uses client-side validation with CSS-based error indicators but no ARIA live region. The fix is a two-line code change: add <code>aria-live=\"polite\"<\/code>codecode to the error container. But the developer has to audit every form in the admin to find all the instances. There are 14 forms in the current build. Three of them have this bug.<\/p>\n<p>A 30-minute fix turns into a half-day audit. The client pays for that time. The developer resents the CMS for shipping without basic accessibility hygiene. The screen-reader user resents the agency for choosing a tool that doesn\u2019t work for them. Nobody wins.<\/p>\n<h2>How EmDash Compares to WordPress on Accessibility<\/h2>\n<p>WordPress has a dedicated accessibility team. The WordPress admin has received years of focused accessibility work. The core team publishes accessibility coding standards. The block editor (Gutenberg) has ARIA labels on every toolbar button, focus management after insertion and deletion, and announced status updates for saving and publishing.<\/p>\n<p>WordPress is not perfect. The media library modal still has focus-trapping issues. Some admin screens lack heading hierarchy. But the baseline is established. Accessibility is a known requirement, not an afterthought.<\/p>\n<p>EmDash, at v0.1.0, has no accessibility team. No accessibility statement. No published standards. The codebase shows no evidence of ARIA-aware patterns in the admin UI. The team used AI coding agents to generate most of the code. AI models are terrible at accessibility unless explicitly prompted for it\u2014and even then, they miss context-specific patterns like focus management after dynamic updates.<\/p>\n<h2>What Would Fix This<\/h2>\n<p>Three specific changes would bring EmDash to a usable baseline:<\/p>\n<p><strong>First, audit every form and modal for ARIA live regions.<\/strong> The notification system needs <code>role=\"status\"<\/code>codecode and <code>aria-live=\"polite\"<\/code>codecode on the toast container. Error states need <code>aria-describedby<\/code>codecode linking the input to its error message. This is paragraph-level work, not architectural.<\/p>\n<p><strong>Second, implement focus trapping in modals.<\/strong> The media library and settings panels that open as overlays need to constrain Tab navigation within the modal and return focus to the trigger on close. Every CMS has this pattern. EmDash just doesn\u2019t implement it yet.<\/p>\n<p><strong>Third, add keyboard-accessible sub-menus.<\/strong> The sidebar navigation needs visible expand indicators on parent items, and sub-menus must open on focus, not just hover. A <code>aria-expanded<\/code>codecode attribute on each parent tells screen readers whether the sub-menu is open or closed.<\/p>\n<p>None of these are hard. They\u2019re standard WCAG patterns documented in thousands of tutorials. The question is whether the EmDash team prioritizes them before the v1.0 release\u2014or waits for the bug reports to roll in.<\/p>\n<h2>Where EmDash Has an Architectural Advantage<\/h2>\n<p>Portable text gives EmDash a structural edge over WordPress for accessibility. Content stored as semantic JSON can be rendered to any output format. A theme could generate a page-edit view that maps each block to its accessible role without parsing HTML. That\u2019s not a feature today. It\u2019s a capability the architecture enables.<\/p>\n<p>The V8 isolate model also means plugins can\u2019t inject inaccessible scripts that affect the entire page. In WordPress, one plugin\u2019s badly coded popup can break keyboard navigation site-wide. In EmDash, that plugin runs in its own sandbox. It can\u2019t touch the DOM of the admin panel. The accessibility of the core interface is protected by default.<\/p>\n<p>That\u2019s the hopeful take. The architecture is better than WordPress\u2019s. But architecture doesn\u2019t write ARIA labels. Someone has to do that work.<\/p>\n<h2>FAQ<\/h2>\n<h3>Does EmDash support ARIA labels in the admin panel?<\/h3>\n<p>Partial support. Some buttons have <code>aria-label<\/code>codecode attributes. The sidebar navigation and notification toasts do not. A full audit would reveal gaps in roughly 40% of interactive elements in the current build.<\/p>\n<h3>Can I add accessibility features to EmDash myself?<\/h3>\n<p>Yes. The code is MIT-licensed on GitHub. You can fork the admin theme and add ARIA attributes, focus management, and keyboard navigation. The Astro-based theme system makes this accessible to any developer who knows modern front-end patterns.<\/p>\n<h3>How does EmDash compare to WordPress for screen reader users?<\/h3>\n<p>WordPress is ahead in every measurable category\u2014focus management, error announcements, heading hierarchy, keyboard navigation. EmDash is behind because it\u2019s new, not because the architecture prevents improvement. The gap is about effort, not capability.<\/p>\n<h3>Will EmDash\u2019s accessibility improve before v1.0?<\/h3>\n<p>The team has not published an accessibility roadmap. The lead engineer has stated that the current release is a developer preview. Accessibility work often happens late in the cycle. Whether it happens here depends on community pressure and internal priority.<\/p>\n<h3>Does portable text help accessibility?<\/h3>\n<p>Yes, indirectly. Structured JSON content is easier for assistive tech to parse than mixed HTML. But the editor that produces portable text must still enforce heading hierarchy, alt text requirements, and link labeling. Portable text enables better accessibility. It <a href=\"https:\/\/overcentral.com\/en\/rascal-does-not-dream-trailer-release-80139\/\" title=\"Rascal Does Not Dream Drops Trailer for Final Film\" data-iacss-internal=\"1\">does not<\/a> guarantee it.<\/p>\n<h2>The Two Audiences<\/h2>\n<p>EmDash is currently built for developers. Developers can work around accessibility gaps. They can patch the admin theme. They can add ARIA labels. They can test with screen readers and fix issues before a client touches the CMS.<\/p>\n<p>But the pitch for EmDash is that it replaces WordPress for content editors, small businesses, and agencies. Those users can\u2019t patch the admin. They need a CMS that works out of the box. A content editor who relies on a screen reader doesn\u2019t care about V8 isolates or portable text. They care that the Save button announces itself and that focus doesn\u2019t disappear after every action.<\/p>\n<p>That\u2019s the tension EmDash hasn\u2019t resolved yet. The architecture is forward-looking. The accessibility is not.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cloudflare\u2019s new CMS, EmDash, launched as a v0.1.0 developer preview. That matters for accessibility. Because what ships today\u2014and what doesn\u2019t\u2014tells you whether this thing was built for real users or just for the demo. Let\u2019s walk through it feature by feature. Built-In: Passkey Authentication EmDash ships with WebAuthn passkeys as the default login method. No [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":100112,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98056.png","fifu_image_alt":"EmDash Accessibility: What Ships and What Doesn\u2019t","footnotes":""},"categories":[31],"tags":[],"class_list":["post-98056","post","type-post","status-publish","format-standard","has-post-thumbnail","category-technology"],"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98056.png","fifu_image_alt":"EmDash Accessibility: What Ships and What Doesn\u2019t","_links":{"self":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98056","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/comments?post=98056"}],"version-history":[{"count":1,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98056\/revisions"}],"predecessor-version":[{"id":100113,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98056\/revisions\/100113"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media\/100112"}],"wp:attachment":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media?parent=98056"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/categories?post=98056"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/tags?post=98056"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}