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_filledmeta 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:
| Field | Where it comes from |
|---|---|
title, caption | The attachment's own title and excerpt |
post_title | The parent post — or the page the Used in scan found it on |
product_categories | WooCommerce, when the parent is a product |
page_keyphrase | Yoast, Rank Math, SEOPress or All in One SEO focus keyphrase |
page_description | The page's meta description from the same plugin |
page_related | Up 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:
| Plugin | Keyphrase key | Cornerstone key |
|---|---|---|
| Yoast SEO | _yoast_wpseo_focuskw | _yoast_wpseo_is_cornerstone |
| Rank Math | rank_math_focus_keyword | rank_math_pillar_content |
| SEOPress | _seopress_analysis_target_kw | — |
| All in One SEO | its 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 happened | What 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-200 | Skips 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