Dev iconDevAug 29, 2026 ~1 min source read

How to generate WCAG-compliant ALT text for WordPress images without sending them to a vendor's black-box API

Every "AI alt text" SaaS I looked at wanted a monthly subscription, routed my images through their own servers, and gave me zero control over which model actually looked at the picture. This post is about the plugin I built to fix that for my own sites, and the handful of implementation details that turned out to matter more than expected.

How to generate WCAG-compliant ALT text for WordPress images without sending them to a vendor's black-box API

Share this story

Send the public story page.

Useful takeaways from this story.

Every "AI alt text" SaaS I looked at wanted a monthly subscription, routed my images through their own servers, and gave me zero control over which model actually looked at the picture.

The part that's not trivial, if you don't want another recurring SaaS bill and don't want to hand a third party your whole media library, is: whose API key, which model, and where does the image actually go.

This post is about the plugin I built to fix that for my own sites, and the handful of implementation details that turned out to matter more than expected.

Building the complete brief

The page is ready to read now. The fuller skim-friendly version will appear here automatically.

The useful part

This post is about the plugin I built to fix that for my own sites, and the handful of implementation details that turned out to matter more than expected. Every "AI alt text" SaaS I looked at wanted a monthly subscription, routed my images through their own servers, and gave me zero control over which model actually looked at the picture. The actual problem WCAG 2.1 Success Criterion 1.1.1 requires non-text content to have a text alternative.

How it works

  • In WordPress terms: every attachment post of MIME type image should have _wp_attachment_image_alt set to something meaningful, not "IMG_4821.jpg" and not empty.
  • Doing this with a vision-capable LLM is trivial in principle â€" send the image, ask for a short description, save it as the alt attribute.
  • The part that's not trivial, if you don't want another recurring SaaS bill and don't want to hand a third party your whole media library, is: whose API key, which model, and where does the image actually go.
  • Design decision: BYOK, not a hosted service The plugin (Alt Text BYOK) doesn't call any server of mine.
  • It calls whatever OpenAI-compatible chat/completions endpoint you configure, with your own API key.

Details worth keeping

If you've ever tried to fix accessibility on an old WordPress site, you know the drill: hundreds of images in the Media Library, most with empty alt attributes, and a WCAG 2.1 audit (or a client demanding one) breathing down your neck. Writing alt text by hand for 400 images is not a fun Tuesday.

Keep reading in the app

Open the app view to save this story, compare related coverage, and continue from the same source.

Open in app