=== Halvane Accessibility Fixes ===
Contributors: minawefky
Tags: accessibility, wcag, ada, alt text, a11y
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 0.1.8
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Finds WCAG failures and fixes the ones that can be fixed safely, in your content and reversibly. Not an overlay — nothing is injected for visitors.

== Description ==

Halvane checks your pages against WCAG 2.1 AA and repairs the failures that can be repaired without a human judgement call. Missing alt text, an undeclared page language, links with no accessible name, untitled embeds, a missing skip link.

**It is not an overlay.** Nothing is injected into your pages for visitors, no widget appears in the corner, and no JavaScript rewrites the DOM at load time. Around a third of the accessibility lawsuits filed in 2025 named sites running an overlay, because repainting a page in the browser leaves the underlying content exactly as inaccessible as it was. Every fix here changes stored content or a real WordPress setting, is visible in the editor afterwards, and has an Undo.

= What it fixes =

* **Missing alt text** — copies the alt text your media library already holds for that image. It only reuses words you wrote; it does not invent a description.
* **Spacers and dividers** — marks images whose filename says they are decorative with an explicit empty alt, so screen readers skip them instead of announcing a filename.
* **Page language not declared** — sets the `lang` attribute from your WordPress site language.
* **Captions as a fallback** — where an image has no alt anywhere but does have a caption, uses the caption. A caption is not always a good description, so this one is worth reviewing afterwards, and the plugin says so.
* **Links with no accessible name** — uses the link's own title attribute as its accessible name, leaving the visible text alone.
* **Untitled iframes** — titles embeds from the embedded page.
* **Skip link** — adds a keyboard skip-to-content link where the theme has none.

That is the whole list — seven fixes. Everything else the scan reports is left in the report as instructions, because it needs a judgement this plugin is not entitled to make.

= What it will not do =

* **Page builders.** Elementor, Divi, WPBakery, Avada, Beaver Builder and Bricks store page content inside themselves rather than in the WordPress editor, so a plugin editing posts cannot reach it. On those sites this plugin fixes site-wide settings and any page not built with the builder — and it names the pages it had to skip rather than counting them as done. Roughly half of WordPress sites use one of these, so please read this line before installing.
* **Judgement calls.** It will not write alt text for a photograph it has never seen, or decide whether your colour contrast is a brand decision. Those stay in the report as instructions for you.
* **Guarantee compliance.** No automated tool can. Automated testing catches roughly a third of WCAG criteria; the rest need a person.

= What costs money, and what does not =

**The fixes are free and have no account attached to them.** They are ordinary PHP running on your own server, and nothing in this plugin checks a licence, counts uses, or expires before applying one. Install it, apply them, never sign up for anything.

**Scanning needs an account**, because that part genuinely runs on adascanner.org rather than on your site — axe-core is a browser engine and cannot run inside PHP, and shipping a second scanner that disagreed with the website's would leave you with two answers and no way to choose. A free account covers it. Paid plans exist for the wider service — whole-site crawls, monitoring, VPAT reports — and none of that changes what the plugin on your server will do.

You can also use the fixes with no scan at all, if you already know what is wrong.

== External services ==

This plugin relies on adascanner.org, a third-party service operated by the plugin author, to scan pages and to check what your account is allowed to do. The plugin does not work without it.

**1. Page scanning — `POST https://adascanner.org/api/scan`**
Sent when you press "Scan now". Transmits: the public URL of your site's home page, your API key, and the standard to test against (WCAG 2.1 AA). The service then fetches that public URL itself and returns the accessibility findings. Your post content, database and credentials are never transmitted.

**2. Account check — `POST https://adascanner.org/api/plugin/verify`**
Sent when the settings screen loads, if you have entered an API key, and cached for 15 minutes. Transmits: your API key. Returns your plan name so the screen can confirm the key was recognised. It gates nothing: the fixes do not consult it and run whether or not it succeeds.

**3. Fix rating — `POST https://adascanner.org/api/plugin/feedback`**
Sent only if you have connected an account, only if you choose to answer the one-question rating shown after a fix changes something, and only when you press Send. Transmits: your API key, which fix you rated, a rating from 1 to 5, whether you ticked "it worked", the page builder detected on your site if any, and the free-text comment you typed. Pressing Skip sends nothing. No rating is ever sent without that press.

Terms of service: https://adascanner.org/terms
Privacy policy: https://adascanner.org/privacy

== Installation ==

1. Install and activate the plugin.
2. Go to **Tools › Halvane**. The fixes are there and ready — no account, no key, nothing to sign up for.
3. To scan as well: create a free account at https://adascanner.org, copy the API key from Dashboard › API keys, paste it on that screen and save. It confirms straight away whether the key was recognised.
4. Press **Scan now** to see what needs fixing, then apply the fixes you want, one at a time.

Take a backup before applying fixes on a site that matters. That is the advice for any plugin that edits content, and it is the advice here.

== Frequently Asked Questions ==

= Is this an accessibility overlay? =

No, and it is built to be the opposite of one. Overlays add a script that rewrites the page in the visitor's browser; the stored content stays broken, which is why sites running them keep being sued. This plugin edits the content itself. Deactivate it and your fixed alt text is still there, because it is now genuinely part of your site.

= What happens to my fixes if I uninstall? =

They stay. Alt text, page language and link names are your content once written, and quietly reverting them on uninstall would leave a site less accessible than it was five minutes earlier. If you want them gone, press Undo on each fix before you remove the plugin. Uninstalling deletes the plugin's own settings and nothing else.

= Does it work with Elementor or Divi? =

Partly, and it tells you where it cannot help. Those builders keep page content in their own storage, out of reach of anything editing WordPress posts. Site-wide fixes still apply; builder pages are named as skipped rather than silently counted as fixed.

= Is it free? =

The fixes are, permanently, with no account. Scanning needs a free account because it runs on our servers rather than yours. Nothing in the plugin code is switched off, time-limited or reserved for a paid plan.

= Will this make my site legally compliant? =

No tool can promise that, and be sceptical of any that does. Automated testing reliably catches about a third of WCAG success criteria. This plugin fixes a subset of that third and reports the rest so a person can deal with them.

= Does it slow my site down? =

No. Nothing runs for visitors on a normal page load. Scanning happens when you press the button, in the admin, and the work is done by the remote service rather than your server.

= Is my content sent to your servers? =

No. The scanner is given your site's public URL and fetches those pages the way any visitor would. Your database, drafts, private posts and credentials never leave your server. See the "External services" section for the exact list of what is transmitted.

== Screenshots ==

1. Tools › Halvane. Connect an account, scan your homepage, and apply fixes one at a time — each with a plain description of what it will change.
2. A fix that has been applied turns into an Undo, on the same row that applied it.
3. Pages a page builder puts out of reach are counted and named, rather than silently passed over.
4. After a fix changes something, the plugin asks once how it went. Skip is right there, and it never asks about that fix again.

== Changelog ==

= 0.1.8 =
* The Tools menu entry and the settings heading now read Halvane rather than ADA Scanner, so the plugin is findable under the name it was installed as.

= 0.1.7 =
* Renamed to Halvane Accessibility Fixes, with the text domain and slug to match.

= 0.1.6 =
* Renamed to Includio Accessibility Fixes, with the text domain and slug to match.

= 0.1.5 =
* Renamed to ADAScanner Accessibility Fixes, with the text domain and slug to match.
* The skip link's CSS is enqueued through wp_add_inline_style() instead of being printed as a style block, so a site can dequeue, cache or concatenate it.

= 0.1.4 =
* Corrected the fix list. Earlier versions of this readme claimed repairs to heading order and to images inside links; neither was ever implemented. The seven fixes now listed are the seven that exist. Alt text from captions was implemented but had been left out.

= 0.1.3 =
* Text domain changed to ada-scanner so it matches the directory slug. Translations do not load otherwise.

= 0.1.2 =
* The fixes no longer ask the server for permission. They are local code and now run for everybody, with no account and no time limit — the previous build gated them behind a plan check, which is not something a hosted plugin may do.
* Removed the countdown banner that advertised that gate.
* An account is now only for scanning, which genuinely runs remotely.
* A rating is only offered when an account is connected, since there is otherwise nothing to attribute it to.

= 0.1.1 =
* Added the API key field to the settings screen. Without it a fresh install had no way to connect an account, which made every other feature unreachable.
* Admin JavaScript moved out of the page into an enqueued file.
* Uninstall cleanup moved to uninstall.php so it runs even if the plugin cannot load.
* A rating can no longer be sent without recording which fix it was about.

= 0.1.0 =
* First public release.
* Seven fixes: alt text from the media library, alt text from captions, decorative images, page language, link names from title attributes, iframe titles, skip link.
* Every fix is reversible from the same screen that applied it.
* Page builder detection: Elementor, Divi, WPBakery, Avada, Beaver Builder and Bricks pages are reported as out of reach rather than counted as fixed.

== Upgrade Notice ==

= 0.1.8 =
The admin screen is now labelled Halvane, matching the plugin name.

= 0.1.7 =
Renamed to Halvane Accessibility Fixes.

= 0.1.6 =
Renamed to Includio Accessibility Fixes.

= 0.1.5 =
Renamed, and the skip link's CSS is now enqueued properly.

= 0.1.4 =
Documentation only: the fix list now matches what the plugin actually does.

= 0.1.3 =
Text domain corrected to match the plugin slug.

= 0.1.2 =
All fixes are now free and need no account. Nothing is gated or time-limited.
