{"id":384341,"date":"2026-10-12T10:42:48","date_gmt":"2026-10-12T10:42:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/alt-text-audit\/"},"modified":"2026-10-12T10:42:38","modified_gmt":"2026-10-12T10:42:38","slug":"altmend","status":"publish","type":"plugin","link":"https:\/\/azb.wordpress.org\/plugins\/altmend\/","author":23583726,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.0","stable_tag":"0.1.0","tested":"7.1.3","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Altmend","header_author":"wgs92","header_description":"Find and fix image alt text. Free audit of what you already have, plus AI suggestions you approve one by one before anything is written.","assets_banners_color":"4b5569","last_updated":"2026-10-12 10:42:38","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":38,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"wgs92","date":"2026-10-12 10:42:38","revision":3741137}},"upgrade_notice":{"0.1.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3741137,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3741137,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3741137,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3741137,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3741138,"resolution":"1","location":"plugin","width":1200,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3741138,"resolution":"2","location":"plugin","width":1200,"height":800},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3741138,"resolution":"3","location":"plugin","width":1200,"height":800}},"screenshots":{"1":"The Alt status column in the Media Library, showing four different states.","2":"The Alt text panel in the post editor, with a suggestion and its risk flag.","3":"The settings screen."}},"plugin_section":[],"plugin_tags":[1953,132703,17214,6357,1956],"plugin_category":[34],"plugin_contributors":[286089],"plugin_business_model":[],"class_list":["post-384341","plugin","type-plugin","status-publish","hentry","plugin_tags-accessibility","plugin_tags-alt-tags","plugin_tags-alt-text","plugin_tags-image-seo","plugin_tags-wcag","plugin_category-accessibility","plugin_contributors-wgs92","plugin_committers-wgs92"],"banners":{"banner":"https:\/\/ps.w.org\/altmend\/assets\/banner-772x250.png?rev=3741137","banner_2x":"https:\/\/ps.w.org\/altmend\/assets\/banner-1544x500.png?rev=3741137","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/altmend\/assets\/icon-128x128.png?rev=3741137","icon_2x":"https:\/\/ps.w.org\/altmend\/assets\/icon-256x256.png?rev=3741137","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/altmend\/trunk\/screenshot-1.png?rev=3741138","caption":"The Alt status column in the Media Library, showing four different states."},{"src":"https:\/\/ps.w.org\/altmend\/trunk\/screenshot-2.png?rev=3741138","caption":"The Alt text panel in the post editor, with a suggestion and its risk flag."},{"src":"https:\/\/ps.w.org\/altmend\/trunk\/screenshot-3.png?rev=3741138","caption":"The settings screen."}],"raw_content":"<!--section=description-->\n<p>Most alt text plugins generate text. Altmend is built around the harder half of the problem: <strong>making the fix actually land on the page.<\/strong><\/p>\n\n<h4>Why that distinction matters<\/h4>\n\n<p>An image block is a static block. WordPress serves the markup stored in your post, not the alt text stored on the attachment. A plugin that only updates the attachment will show you a success message while your front end keeps serving <code>alt=\"\"<\/code>.<\/p>\n\n<p>Altmend writes to all three places that matter:<\/p>\n\n<ol>\n<li>The image block attributes, so the editor shows the right thing.<\/li>\n<li>The <code>&lt;img&gt;<\/code> tag inside your post content \u2014 this is the one your visitors actually receive.<\/li>\n<li>The attachment record, so future uses of the same image inherit it.<\/li>\n<\/ol>\n\n<h4>It never writes without your approval<\/h4>\n\n<p>This is a deliberate design decision, not a missing feature.<\/p>\n\n<p>Across 39 images reviewed by hand, one class of error survived every prompt improvement we tried: the model would sometimes leave out something occupying a large part of the frame \u2014 buildings covering 25\u201330% of a photo, for example. There is no reliable automatic way to detect that omission, so a fully automatic mode would silently publish incomplete descriptions on your live site.<\/p>\n\n<p>So Altmend suggests, flags its own uncertainty, and waits. You approve, edit, skip, or mark the image decorative, one image at a time.<\/p>\n\n<h4>Start with no API key and no cost<\/h4>\n\n<p>The first thing you get costs nothing and needs no account. Altmend scans the alt text you already have and flags the common problems: file names like <code>DSC_01234.jpg<\/code>, generic text like \"image\", keyword stuffing, redundant openings such as \"This is an image of\", markdown that leaked in from a paste, and text that is simply too long for a screen reader.<\/p>\n\n<p>That scan runs entirely on your server. No API calls, no key, instant results in the Media Library.<\/p>\n\n<h4>Decorative images are your call, not the plugin's<\/h4>\n\n<p>Whether an image should have an empty alt attribute depends on how you are using it, not on what the image contains. A marble texture used as a background should be empty; the same file used to illustrate a product's material should not be. Altmend pre-selects an answer and asks you to confirm it.<\/p>\n\n<h4>What it does not do<\/h4>\n\n<ul>\n<li>No overlay, toolbar or widget on your front end. Those do not fix the underlying markup.<\/li>\n<li>No \"make my site accessible\" claim. Content fixes are one part of accessibility, not all of it.<\/li>\n<li>No changes to your content without your approval.<\/li>\n<li>No colour-contrast or theme-level fixes. Those are code problems, and this plugin stays out of them.<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<p>The image scanner in the editor works with the block editor, covering image, cover, media &amp; text, and gallery blocks. Classic editor content is handled when the alt text is written back.<\/p>\n\n<h3>External services<\/h3>\n\n<p><strong>The free audit does not contact any external service.<\/strong> It runs entirely on your server, and the plugin sends nothing anywhere unless you configure a provider and click a button.<\/p>\n\n<p>AI suggestions are opt-in. To use them you supply your own API key for a service of your choice. Altmend ships with no provider configured and no keys of its own.<\/p>\n\n<p>When you click \"Suggest alt text\" for an image, the plugin sends <strong>that single image, resized to a mid-size thumbnail<\/strong>, to the API endpoint you configured, together with the instruction prompt. Nothing else is transmitted: no post content, no other media, no user data, no site information, no telemetry. The request happens only on that click \u2014 there is no background scanning and no call-home behaviour.<\/p>\n\n<p>The plugin author does not operate a proxy or relay and never receives your images, your key, or any data from your site.<\/p>\n\n<p>Any OpenAI-compatible vision endpoint works. Examples of services you might choose, with their terms and privacy policies:<\/p>\n\n<ul>\n<li>OpenAI \u2014 https:\/\/openai.com\/policies\/terms-of-use and https:\/\/openai.com\/policies\/privacy-policy<\/li>\n<li>Anthropic \u2014 https:\/\/www.anthropic.com\/legal\/consumer-terms and https:\/\/www.anthropic.com\/legal\/privacy<\/li>\n<li>Google (Gemini) \u2014 https:\/\/ai.google.dev\/gemini-api\/terms and https:\/\/policies.google.com\/privacy<\/li>\n<li>Alibaba Cloud Model Studio (DashScope) \u2014 https:\/\/www.alibabacloud.com\/help\/en\/legal\/latest\/alibaba-cloud-international-website-product-terms-of-service and https:\/\/www.alibabacloud.com\/help\/en\/legal\/latest\/privacy-policy<\/li>\n<\/ul>\n\n<p>You are responsible for confirming that you are allowed to send your site's images to whichever provider you choose.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install it through the Plugins screen.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Optional: open Settings \u2192 Altmend and enter your API endpoint, key and model if you want AI suggestions. You can skip this and still use the free audit.<\/li>\n<\/ol>\n\n<h4>Where things live<\/h4>\n\n<ul>\n<li><strong>Media \u2192 Library<\/strong> \u2014 the \"Alt status\" column shows what needs attention. This column never calls an API.<\/li>\n<li><strong>Post editor<\/strong> \u2014 open the \"Alt text\" panel on the right to work through the images in a post one at a time.<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20api%20key%3F\"><h3>Do I need an API key?<\/h3><\/dt>\n<dd><p>No. The alt status column and the audit of your existing alt text work without one and cost nothing.<\/p><\/dd>\n<dt id=\"will%20it%20change%20my%20images%20or%20posts%20on%20its%20own%3F\"><h3>Will it change my images or posts on its own?<\/h3><\/dt>\n<dd><p>No. Suggestions are stored separately. Your post content and attachment alt text change only when you explicitly approve something.<\/p><\/dd>\n<dt id=\"why%20not%20just%20generate%20alt%20text%20automatically%3F\"><h3>Why not just generate alt text automatically?<\/h3><\/dt>\n<dd><p>Because the automation cannot yet tell when it has left something out, and a wrong description on a live page is worse than an empty one. For a background image, the correct answer is an empty alt attribute \u2014 something an automatic generator will rarely decide on its own.<\/p><\/dd>\n<dt id=\"does%20it%20support%20the%20block%20editor%3F\"><h3>Does it support the block editor?<\/h3><\/dt>\n<dd><p>Yes, and it covers image, cover, media &amp; text, and gallery blocks.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20change%20the%20model%3F\"><h3>What happens if I change the model?<\/h3><\/dt>\n<dd><p>Any OpenAI-compatible vision model works, but behaviour varies \u2014 usually in how much detail a model includes, not in correctness. Test on a few images before processing a large library.<\/p><\/dd>\n<dt id=\"will%20my%20edits%20be%20lost%20if%20i%20save%20the%20post%20afterwards%3F\"><h3>Will my edits be lost if I save the post afterwards?<\/h3><\/dt>\n<dd><p>No. When you approve a suggestion, the plugin also updates the block attributes in the editor, so the editor and the database hold the same value and saving is a no-op.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<li>Free audit of existing alt text: file names, generic text, keyword stuffing, redundant openings, markdown, over-length.<\/li>\n<li>AI suggestions with per-image approval in the post editor.<\/li>\n<li>Writes approved fixes to block attributes, post content, and the attachment record.<\/li>\n<li>Decorative-image confirmation.<\/li>\n<li>Records every generated suggestion and every change, including the model and prompt version used.<\/li>\n<\/ul>","raw_excerpt":"Free alt text audit with no API key. Approved fixes are written to your real content \u2014 block attributes, post HTML and the media library.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/azb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/384341","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/azb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/azb.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/azb.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=384341"}],"author":[{"embeddable":true,"href":"https:\/\/azb.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wgs92"}],"wp:attachment":[{"href":"https:\/\/azb.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=384341"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/azb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=384341"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/azb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=384341"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/azb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=384341"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/azb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=384341"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/azb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=384341"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}