{"id":377853,"date":"2026-09-30T01:23:48","date_gmt":"2026-09-30T01:23:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/a11y-ledger\/"},"modified":"2026-09-30T01:23:33","modified_gmt":"2026-09-30T01:23:33","slug":"lumadro-accessibility-ledger","status":"publish","type":"plugin","link":"https:\/\/ne.wordpress.org\/plugins\/lumadro-accessibility-ledger\/","author":23576372,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.1","stable_tag":"0.1.1","tested":"7.1.2","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Lumadro Accessibility Ledger","header_author":"Lumadro","header_description":"Keeps a dated, append-only record of your accessibility work: the WCAG 2.1 AA failures found, every change made, who approved it, and what was not checked. Drafts alt text with your own AI key; every change is reviewed and can be undone. Not an overlay. Does not make a site legally compliant.","assets_banners_color":"1a3178","last_updated":"2026-09-30 01:23:33","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wpstore.lumadro.com\/accessibility-ledger\/","header_author_uri":"https:\/\/wpstore.lumadro.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":45,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.1":{"tag":"0.1.1","author":"lumadro","date":"2026-09-30 01:23:33","revision":3720122}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3720122,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3720122,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3720122,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3720122,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3720122,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3720122,"resolution":"1","location":"assets","locale":"","width":1280,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3720122,"resolution":"2","location":"assets","locale":"","width":1280,"height":800},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3720122,"resolution":"3","location":"assets","locale":"","width":1280,"height":800},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3720122,"resolution":"4","location":"assets","locale":"","width":1280,"height":800},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3720122,"resolution":"5","location":"assets","locale":"","width":1280,"height":800}},"screenshots":{"1":"The change log: every change with its before, after, date, approver and source.","2":"The report, with coverage limits inside the document.","3":"The review screen, with provenance warnings on text a person wrote.","4":"The browser check running on a checkout page.","5":"The coverage screen, listing all 50 criteria and their status."}},"plugin_section":[],"plugin_tags":[1953,209467,17214,8533,1956],"plugin_category":[34],"plugin_contributors":[283543],"plugin_business_model":[],"class_list":["post-377853","plugin","type-plugin","status-publish","hentry","plugin_tags-accessibility","plugin_tags-accessibility-checker","plugin_tags-alt-text","plugin_tags-audit","plugin_tags-wcag","plugin_category-accessibility","plugin_contributors-lumadro","plugin_committers-lumadro"],"banners":{"banner":"https:\/\/ps.w.org\/lumadro-accessibility-ledger\/assets\/banner-772x250.png?rev=3720122","banner_2x":"https:\/\/ps.w.org\/lumadro-accessibility-ledger\/assets\/banner-1544x500.png?rev=3720122","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/lumadro-accessibility-ledger\/assets\/icon.svg?rev=3720122","icon":"https:\/\/ps.w.org\/lumadro-accessibility-ledger\/assets\/icon.svg?rev=3720122","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/lumadro-accessibility-ledger\/assets\/screenshot-1.png?rev=3720122","caption":"The change log: every change with its before, after, date, approver and source."},{"src":"https:\/\/ps.w.org\/lumadro-accessibility-ledger\/assets\/screenshot-2.png?rev=3720122","caption":"The report, with coverage limits inside the document."},{"src":"https:\/\/ps.w.org\/lumadro-accessibility-ledger\/assets\/screenshot-3.png?rev=3720122","caption":"The review screen, with provenance warnings on text a person wrote."},{"src":"https:\/\/ps.w.org\/lumadro-accessibility-ledger\/assets\/screenshot-4.png?rev=3720122","caption":"The browser check running on a checkout page."},{"src":"https:\/\/ps.w.org\/lumadro-accessibility-ledger\/assets\/screenshot-5.png?rev=3720122","caption":"The coverage screen, listing all 50 criteria and their status."}],"raw_content":"<!--section=description-->\n<p>Lumadro Accessibility Ledger keeps the record that accessibility work usually leaves scattered\nacross emails and memory. It finds specific WCAG 2.1 AA failures, helps you fix them\nin your actual content, and writes every step into an append-only ledger you\ncan export: each finding with the success criterion it fails, each change with\nits before and after, the date, who approved it, and whether AI drafted it.<\/p>\n\n<p>The European Accessibility Act has applied since 28 June 2025 to many products\nand services sold to consumers in the EU, online shops among them, wherever the\nseller is based. Its technical reference is WCAG 2.1 level AA, through EN 301 549.\nWhen someone asks what you have done about accessibility, the answer should be\na document, not a feeling.<\/p>\n\n<p><strong>It does not make your site legally compliant, and no plugin can.<\/strong> It finds\nspecific problems, helps you fix them properly, and documents the effort in a\nform you can show someone, with the tool's own limits written into it.<\/p>\n\n<p><strong>This is not an accessibility overlay.<\/strong> It adds nothing to the front end and\ndoes not change what visitors see at runtime. It changes the underlying content.<\/p>\n\n<h4>The ledger<\/h4>\n\n<ul>\n<li>Every accepted change is recorded with the date, the text before and after,\nthe person who approved it, the AI provider that drafted it (or that a person\nwrote it), and whether the reviewer edited the draft.<\/li>\n<li>The ledger is append-only. An undo is added as a new entry; nothing is erased.<\/li>\n<li>When a later scan of the same page no longer finds a problem, the ledger\nrecords it as \"no longer detected\" with the date, whether it was fixed here\nor anywhere else. It is never presented as proof of a fix: the content may\nsimply have changed.<\/li>\n<li>A downloadable report lists open findings grouped by success criterion, each\nwith its page, and counts confirmed failures apart from items flagged for a\nperson to review. It includes the full change log and a section on what the\nchecks did not cover.\nIt will never say the site is fully conformant, fully accessible or legally\ncompliant.<\/li>\n<\/ul>\n\n<h4>How it finds problems<\/h4>\n\n<p><strong>Site scan.<\/strong> Reads every published post and page and every library image, in\nthe background, and fetches each published page once to check what the theme\nadds. It finds:<\/p>\n\n<ul>\n<li>Images with no alt attribute, and alt text that is really a file name<\/li>\n<li>Links and buttons with no accessible name, including icon-only ones<\/li>\n<li>Form fields with no label, and frames with no title<\/li>\n<li>Headings that skip a level, and pages with no h1<\/li>\n<li>A missing or malformed page language, and missing or placeholder page titles<\/li>\n<li>Data tables with no header cells, and positive tabindex values<\/li>\n<\/ul>\n\n<p><strong>Browser check.<\/strong> Loads your pages in your own browser tab and runs the open\nsource axe-core engine on them. It sees what visitors see: computed colour\ncontrast, and forms and content that JavaScript builds after the page loads,\nsuch as a block checkout. It then probes what axe-core cannot: whether the page\nscrolls sideways at 320 pixels wide (reflow), whether elements show a visible\nchange when they take focus, whether clickable elements can be reached from the\nkeyboard, and whether content that opens on focus closes with Escape. These are\nlisted for review, never as proven failures. Each run starts with the home page\nand shop pages, then pages never checked, then those checked longest ago, so\nrepeated runs work through the whole site; the browser check screen lists pages\nby when they were last checked, and the report says how many never were.\nNothing is sent to any other service.<\/p>\n\n<h4>How it fixes them<\/h4>\n\n<p>AI drafts the part that is slow to write by hand: alt text. It uses your own\nprovider key through WordPress core's AI Client, so there are no credits and no\nper-fix charges; you pay your provider directly, at cost, for any volume.\nScanning, the browser check and the reports work with no AI configured at all.<\/p>\n\n<p>Fixes go where the problem is. A library image's alt text is used wherever it is\nplaced from then on. An image already placed in a post is fixed in that post,\nwith a normal post revision, and if the library already describes that image\nwell, its description is offered without an AI call.<\/p>\n\n<h4>Nothing changes without you<\/h4>\n\n<ul>\n<li>A draft is only a draft until you accept it, and you can edit it first.<\/li>\n<li><strong>Text a person wrote is never replaced silently.<\/strong> Replacing it needs a\ndeliberate choice on that item: tick \"Replace the text a person wrote\" and\naccept. In a post, an image someone marked decorative (alt=\"\") counts as a\nperson's decision too.<\/li>\n<li>Every change can be undone. If someone has edited the text since, the undo\nrefuses rather than discarding their edit.<\/li>\n<\/ul>\n\n<h4>Lumadro Accessibility Ledger Pro<\/h4>\n\n<p>The free plugin is complete for fixing and recording work one item at a time.\nPro, a separate paid plugin, adds:<\/p>\n\n<ul>\n<li>Bulk accept and reject (still never replacing text a person wrote)<\/li>\n<li>Scheduled weekly or monthly re-scans, with a dated scan history you can add to the downloaded report<\/li>\n<li>JSON export of the report and CSV export of the change log<\/li>\n<li>A drafted accessibility statement written from the same evidence<\/li>\n<li>A network overview of every site's evidence on multisite<\/li>\n<li>A portfolio of your separate sites: each exports a summary file, and one\nsite shows them all in one table (no site contacts another)<\/li>\n<\/ul>\n\n<p>Pro uses the same bring-your-own-key AI, with no credits or per-fix charges.<\/p>\n\n<h4>How much of WCAG this covers<\/h4>\n\n<p>The site scan checks 10 of the 50 WCAG 2.1 level A and AA success criteria. The\nbrowser check adds partial checks of a few more on the pages it loads, and the\nreport says exactly which and how far. The rest need a person, and the plugin\nlists every one of them by name on its \"Coverage and limits\" screen and inside\nevery report. Passing the automated checks does not mean your site conforms.<\/p>\n\n<p>We would rather tell you that than let you believe otherwise.<\/p>\n\n<h3>External services<\/h3>\n\n<p><strong>Your AI provider (optional).<\/strong> Drafting alt text uses the provider you connect\nyourself under Settings &gt; Connectors, through WordPress core's AI Client. Only\nwhen you ask for drafts, the plugin sends the provider the image (the file from\nyour media library, or its public URL on your own site), the image's file name,\ncaption, description and current alt text, and the title, language and nearby text of the published page it\nappears on. Nothing from password-protected or private content is sent. No data\nis sent to the provider while scanning, running the browser check or building\nreports, and nothing is sent at all if no provider is connected. The provider's\nown terms of service and privacy policy apply; see your provider's website (for\nexample https:\/\/openai.com\/policies\/, https:\/\/www.anthropic.com\/legal or\nhttps:\/\/policies.google.com\/).<\/p>\n\n<p>When WordPress's AI Client is missing or has no provider set up, and the\nseparate AI Services plugin is installed with a provider, drafting uses that\ninstead. It sends\nthe same text (the image's file name, caption, description, current alt text\nand the page context above) but not the image itself, only when you ask for\ndrafts, to the provider configured in AI Services, under that provider's terms.<\/p>\n\n<p><strong>No licensing or update service.<\/strong> This plugin contains no licensing code and\ncontacts no licensing or update service; it updates from WordPress.org like any\nother plugin.<\/p>\n\n<p>The browser check and the site scan contact no outside service: the scan only\nfetches your own site's pages, and axe-core runs in your own browser.<\/p>\n\n<h3>Third-party libraries<\/h3>\n\n<ul>\n<li>axe-core 4.13.0 by Deque Systems, Mozilla Public License 2.0.\nSource: https:\/\/github.com\/dequelabs\/axe-core\nBundled unmodified in assets\/vendor\/axe-core and loaded only into your own\npages during a browser check started from the admin screen.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Open Lumadro Accessibility Ledger and scan the whole site. This needs no AI and no setup.<\/li>\n<li>Run the browser check from its screen to add contrast and JavaScript-built\ncontent. For a shop, put a product in your cart first.<\/li>\n<li>To draft alt text, add your own provider key under Settings &gt; Connectors\n(WordPress 7.0 or later), then draft from the review screen.<\/li>\n<li>Review every draft before accepting it, then download the report from the\n\"Report\" screen.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20this%20an%20accessibility%20overlay%3F\"><h3>Is this an accessibility overlay?<\/h3><\/dt>\n<dd><p>No. Overlays modify the page for visitors at runtime and are widely criticised by\naccessibility practitioners for not achieving conformance. This plugin changes\nthe content itself and adds nothing to the front end.<\/p><\/dd>\n<dt id=\"does%20it%20make%20my%20site%20eaa%20or%20ada%20compliant%3F\"><h3>Does it make my site EAA or ADA compliant?<\/h3><\/dt>\n<dd><p>No, and be suspicious of anything that says it does. Compliance is a legal\njudgement about your whole service. This plugin finds and helps fix specific\ntechnical failures and documents the work. That documentation may be useful\nevidence of effort. It is not a certificate and it is not legal advice.<\/p><\/dd>\n<dt id=\"what%20is%20in%20the%20report%3F\"><h3>What is in the report?<\/h3><\/dt>\n<dd><p>The date and scope of the last scan and browser check, open findings grouped by\nsuccess criterion and page, the complete change log, and the criteria that were\nnot checked, with the reason. You can download it as Markdown; Pro adds JSON\nand a CSV of the change log.<\/p><\/dd>\n<dt id=\"does%20it%20check%20colour%20contrast%3F\"><h3>Does it check colour contrast?<\/h3><\/dt>\n<dd><p>Partly, through the browser check. It only covers the pages it loads, in one\ndesktop-width view, and text over images or gradients is listed for you to check\nby eye.<\/p><\/dd>\n<dt id=\"does%20it%20check%20keyboard%20access%20and%20visible%20focus%3F\"><h3>Does it check keyboard access and visible focus?<\/h3><\/dt>\n<dd><p>Partly. The browser check focuses up to 60 elements on each page it loads and\nlists those that show no visible change, and lists elements that look clickable\nbut cannot take keyboard focus. It does not press the Tab key, so keyboard\ntraps and focus order still need a person using a keyboard, and it cannot tell\nwhether a focus style is easy to see.<\/p><\/dd>\n<dt id=\"does%20it%20check%20forms%20built%20by%20javascript%3F\"><h3>Does it check forms built by JavaScript?<\/h3><\/dt>\n<dd><p>The site scan does not: it reads your stored content. The browser check does,\nonce the page has finished loading. It does not fill forms in or step through a\ncheckout, and a WooCommerce checkout only shows its form when the cart has\nsomething in it, so add a product to your cart first.<\/p><\/dd>\n<dt id=\"will%20it%20overwrite%20alt%20text%20i%20wrote%20myself%3F\"><h3>Will it overwrite alt text I wrote myself?<\/h3><\/dt>\n<dd><p>Not unless you explicitly choose to, one item at a time, in the media library\nor in a post. (Pro's bulk accept cannot touch text a person wrote either.)<\/p><\/dd>\n<dt id=\"does%20the%20browser%20check%20send%20my%20pages%20anywhere%3F\"><h3>Does the browser check send my pages anywhere?<\/h3><\/dt>\n<dd><p>No. axe-core is bundled with the plugin and runs in your browser, on your own\nsite's pages. Results go only to your own site.<\/p><\/dd>\n<dt id=\"who%20can%20use%20it%3F\"><h3>Who can use it?<\/h3><\/dt>\n<dd><p>Editors and administrators. Accepting, rejecting or undoing a change also needs\npermission to edit that particular post or image, so a draft for content you\ncannot edit is not shown to you. Settings are for administrators only.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens to my data if I delete the plugin?<\/h3><\/dt>\n<dd><p>By default the change log and scan history stay in your database, because they\nare your evidence of the work. An administrator can tick \"Delete all Lumadro\nAccessibility Ledger data when the plugin is deleted\" on the dashboard to\nremove them on deletion. Alt text already\nwritten is never removed: it is part of your content. On multisite each\nsite decides for itself.<\/p><\/dd>\n<dt id=\"what%20does%20it%20cost%20to%20run%3F\"><h3>What does it cost to run?<\/h3><\/dt>\n<dd><p>You pay your AI provider directly for the drafting you use, and nothing to us for\nit. There is no credit system.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>First public release.<\/li>\n<\/ul>","raw_excerpt":"A dated record of your site&#039;s accessibility work: what failed, what changed, who approved it, and what was not checked.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/377853","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=377853"}],"author":[{"embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/lumadro"}],"wp:attachment":[{"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=377853"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=377853"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=377853"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=377853"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=377853"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=377853"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}