Skip to the document
DocsThe AI layer

Descriptions and alt text

VergeLabs Library → AI.

Alt text written for screen readers, not search engines #

The rules the model is held to:

  • Never empty. An image with no alt text is invisible to a screen reader.
  • One sentence.
  • No "image of" preamble. A screen reader already announces it as an image.
  • Nothing invented that is not visible.
  • In your site's language.

That is a deliberate position and it is the opposite of what a keyphrase-stuffing plugin does — which the same SEO plugins mark you down for.

Backfill from descriptions you already paid for #

Fill missing alt text writes stored captions into alt text:

  • Only where alt is empty. Your own words are never overwritten.
  • Everything it writes is marked with the _vergeml_alt_filled meta key.
  • So the whole lot comes back out again — one undo removes exactly what it wrote and nothing else.

This costs no credits. It reads descriptions your library already holds.

Page context #

An image inherits the intent of the page it sits on.

What travels with the request, when Page context is on:

FieldWhere it comes from
title, captionThe attachment's own title and excerpt
post_titleThe parent post — or the page the Used in scan found it on
product_categoriesWooCommerce, when the parent is a product
page_keyphraseYoast, Rank Math, SEOPress or All in One SEO focus keyphrase
page_descriptionThe page's meta description from the same plugin
page_relatedUp to three related keyphrases

It is strictly advisory. The model is told to use it for wording and never to repeat a keyphrase back at a picture that does not show it. Keyphrase-stuffed alt text is exactly what those same SEO plugins penalise.

One switch, on by default. Turn it off and nothing about your pages leaves the site.

Site profile #

A free-text field — what the site is about, in your words. It is capped and stripped, and it goes with every description so the model does not have to guess what it is not allowed to guess. Optional.

Fix alt text on your SEO pages #

A report that finds images with no alt text on pages your SEO plugin has given a focus keyphrase — the pages you are already being marked down for — and describes those first.

Pages marked cornerstone (Yoast) or pillar content (Rank Math) come ahead of the rest.

Keyphrase and cornerstone markers are read from each plugin's own meta keys:

PluginKeyphrase keyCornerstone key
Yoast SEO_yoast_wpseo_focuskw_yoast_wpseo_is_cornerstone
Rank Mathrank_math_focus_keywordrank_math_pillar_content
SEOPress_seopress_analysis_target_kw—
All in One SEOits own table—

Running it #

On screen. Up to 24 files per step, 8 in flight at once. Progress is real, and reloading the page resumes where it stopped. Anything described in the last ten minutes is held back, so a double click cannot spend twice on the same file.

In the background. The same step function on WP-Cron, so the run carries on after you close the tab. 20 seconds of work per tick, chunks of 8, a 30-second gap. It stops by itself when credits run out or the licence is refused, and says which.

Progress in the background tracks site traffic, because that is when WP-Cron fires. A site with a real system cron runs every minute regardless.

What gets described #

Images only — wp_attachment_is_image() has to be true. A downsized intermediate is sent, never the original: the plugin picks the largest thumbnail under about 1.5 MB.

Errors, and what they cost you #

What happenedWhat the run does
Licence unknown, revoked, or site not activated (401/403)Stops the whole run and says the licence was not accepted
Out of credits (402)Stops cleanly and says to top up
Rate limited (429)Stops; a Retry-After says when
Anything else non-200Skips that one file, writes an error stub, carries on

401, 402 and 403 are fatal to the batch on purpose — there is no sense burning the rest of a run on calls that will fail identically.

Every failed image is refunded. Credits are metered before the image is sent and given back when the provider fails, so you pay for descriptions and not for attempts.

Re-describing #

A row records model, model_version and prompt_hash. When any of the three changes, the row can be identified as produced by an older setup and re-described deliberately. Nothing re-runs automatically and nothing is spent without you asking.

Fields you have edited by hand are recorded in the row's locked list — per field, not per row — so a re-describe leaves your wording alone and rewrites only what you never touched.

Written from version 3.15.0 of the plugin. Last updated 2026-10-02. All documentation · Legal · Support