a11y

Accessibility tools for any web app

Profiles, filters, reading mask — plus an optional self-hosted dashboard to hide tools, read usage stats, and manage many websites.

Get started Dashboard
npm version license demo

Everything in one toolbar

Tap the floating button to try the live widget. Settings persist in localStorage.

Control panel

Optional and self-hosted. Pair each app with a site key. Skip it and the widget still works with the full shelf. Always free — unlimited websites, no fees.

Control panel dashboard showing users, shelf opens, and top tools
Usage dashboard — filter all websites or one site

Pair with a site key

Shelf editor with floating button color and icon options
Shelf — floating button, tools, live preview
Accessibility.mount({
  panelUrl: 'https://a11y.your-server.tld',
  siteKey: 'a11y_site_…', // one key per app
});

Run the dashboard

Server: Docker Engine, 1 CPU / 512 MB RAM, port 8787 (or 80/443 with TLS), a data volume for SQLite. No GitHub. No extra database.

docker run -d --name a11y-panel --restart unless-stopped \
  -p 8787:8787 \
  -v a11y-panel-data:/data \
  -e A11Y_PANEL_ORIGIN=http://YOUR_SERVER:8787 \
  nemreen/a11y-panel:latest

Open that URL — first visit is the install wizard. No Docker: npx @a.nemreen/a11y-panel. Widget: npm install @a.nemreen/a11y.

Sample content

Enlarge this text, highlight links, pause motion, or enable the reading mask. Headings respond to highlight-titles mode.

Readable experience

The quick brown fox jumps over the lazy dog. الحمد لله رب العالمين — sample Arabic for RTL and dyslexia-friendly checks.

Related: DGA UI Related: loggo

Install

npm install @a.nemreen/a11y

Plain HTML / any framework

import { Accessibility } from '@a.nemreen/a11y';
import '@a.nemreen/a11y/styles.css';

Accessibility.mount({ position: 'end' });
Accessibility.createSkipLink({ href: '#main' });

Angular / React / Vue

Mount once at the app root (same API). No framework peer dependencies — the widget is vanilla DOM.

// e.g. main.ts / App.tsx / main.js
Accessibility.mount();