{"id":79846,"date":"2026-07-13T14:17:24","date_gmt":"2026-07-13T14:17:24","guid":{"rendered":"https:\/\/owncloud.com\/?p=79846"},"modified":"2026-07-13T14:18:55","modified_gmt":"2026-07-13T14:18:55","slug":"alt-text-for-every-image-no-manual-work-no-excuses","status":"publish","type":"post","link":"https:\/\/owncloud.com\/de\/blogs\/alt-text-for-every-image-no-manual-work-no-excuses\/","title":{"rendered":"Alt Text for Every Image. No Manual Work. No Excuses."},"content":{"rendered":"<p>There&#8217;s a quiet compliance problem in almost every enterprise file sharing deployment. Images get uploaded without alt text. Not because anyone thinks accessibility is unimportant. Because writing alt text manually is slow, nobody enforces it, and &#8222;we&#8217;ll do it later&#8220; becomes &#8222;we never did it.&#8220;<\/p>\n<p><a href=\"https:\/\/www.w3.org\/TR\/WCAG22\/\" target=\"_blank\" rel=\"noopener\">WCAG 2.2<\/a> requires descriptive alt text for all non-decorative images. <a href=\"https:\/\/www.etsi.org\/human-factors-accessibility\/en-301-549-v3-the-harmonized-european-standard-for-ict-accessibility\" target=\"_blank\" rel=\"noopener\">EN 301 549<\/a> \u2014 the European accessibility standard for public sector ICT \u2014 mandates it. Organisations deploying oCIS in schools, government, and research institutions operate under these requirements. And until today, oCIS had no way to help meet them.<\/p>\n<p>web-app-ai-image-alt-text-sidebar merged this morning. <a href=\"https:\/\/github.com\/owncloud\/web-extensions\/pull\/467\" target=\"_blank\" rel=\"noopener\">PR #467<\/a>. 16 commits. <a href=\"https:\/\/github.com\/LukasHirt\" target=\"_blank\" rel=\"noopener\">Lukas Hirt<\/a>.<\/p>\n<h3>What It Does<\/h3>\n<p>Select any image file in oCIS: .jpg, .png, .webp, .gif. An &#8222;Alt Text&#8220; tab appears in the sidebar. Click it. The extension downloads the image via WebDAV, base64-encodes it, and sends it to your configured vision-capable LLM. The result appears in an editable text field. Copy it, edit it, or save it directly back to the file.<\/p>\n<p>Generated alt text is persisted to the file as a <a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc4918\" target=\"_blank\" rel=\"noopener\">WebDAV<\/a> custom property: urn:oc:ai:alt-text:text. Written back via PROPPATCH. Retrieved on the next panel open via PROPFIND. The alt text survives the session, survives panel close, and will be ready when screen readers and search indexers learn to look for that property.<\/p>\n<p>Three states based on LLM configuration:<\/p>\n<ul>\n<li><strong>Vision model configured:<\/strong> full descriptive alt text generated. Copy, Regenerate, and Save available.<\/li>\n<li><strong>Text-only model configured:<\/strong> panel shows a notice that the model doesn&#8217;t support image input and prompts the administrator to switch endpoints. Informed user, not a broken experience.<\/li>\n<li><strong>No LLM configured:<\/strong> the Alt Text tab is hidden entirely. No confusion, no dead UI.<\/li>\n<\/ul>\n<h3>A 4 MB Guard and What It Tells You About the Engineering<\/h3>\n<p>The extension applies a 4 MB image size limit before encoding and sending the payload. Anything larger triggers a user-facing message. That guard is there because most vision LLMs have context window limits \u2014 a 12 MB product photo sent to a small local model will either fail silently or produce degraded output. The guard surfaces the limit explicitly.<\/p>\n<p>Copy, Regenerate, and Save are three different buttons for three different use cases: put the alt text somewhere else, generate again if the first result missed the mark, or store it on the file.<\/p>\n<h3>WCAG, EN 301 549, and Why This Matters for Public Sector<\/h3>\n<p>The <a href=\"https:\/\/eur-lex.europa.eu\/eli\/dir\/2019\/882\/oj\" target=\"_blank\" rel=\"noopener\">EU Accessibility Act<\/a> entered into force in 2025. The <a href=\"https:\/\/eur-lex.europa.eu\/eli\/dir\/2016\/2102\/oj\" target=\"_blank\" rel=\"noopener\">Web Accessibility Directive<\/a> has applied to public sector bodies since 2018. EN 301 549 is the harmonised standard. For any organisation deploying oCIS in a public sector context \u2014 one existing organisation using ownCloud alone serves millions of students \u2014 WCAG compliance isn&#8217;t optional.<\/p>\n<p>Missing alt text is <a href=\"https:\/\/webaim.org\/projects\/million\/\" target=\"_blank\" rel=\"noopener\">one of the most commonly flagged WCAG failures<\/a> in automated audits. An extension that generates a credible first draft in seconds, lets the user edit it, and writes it back to the file in a persistent format is a meaningful compliance tool, not just a convenience feature.<\/p>\n<p>Search engine indexing of the stored WebDAV property requires a future oCIS server-side change \u2014 explicitly noted as out of scope in the PR. The property is being written today so it will be ready when server-side support arrives.<\/p>\n<h3>The PR Was AI-Generated. So Was the Tooling.<\/h3>\n<p>The PR description itself was AI-generated, marked explicitly at the top: &#8222;AI-generated \u00b7 OSPO-46 \u00b7 Gate: \u2705 1.00.&#8220; This is the <a href=\"https:\/\/owncloud.com\/opensource\/ai-contribution-policy\/\">AI-Assisted Contribution Policy<\/a> in practice \u2014 not just on the code but on the entire pull request workflow.<\/p>\n<p>The extension was generated using extctl \u2014 a <a href=\"https:\/\/github.com\/LukasHirt\/extctl\" target=\"_blank\" rel=\"noopener\">tool Lukas built<\/a> for scaffolding oCIS web extensions. Lukas isn&#8217;t just writing extensions. He&#8217;s building tooling that makes writing extensions faster. The OSPO-46 Jira ticket tracks this as part of a deliberate programme. Gate score: 1.00.<\/p>\n<h3>Five PRs in Eight Days<\/h3>\n<table style=\"height: 171px;\" width=\"550\" data-table-width=\"760\" data-layout=\"default\" data-local-id=\"76a48c89d742\">\n<tbody>\n<tr data-local-id=\"913a0acfd59b\">\n<td><strong>Date<\/strong><\/td>\n<td><strong>PR<\/strong><\/td>\n<td><strong>What it does<\/strong><\/td>\n<\/tr>\n<tr data-local-id=\"ee3d5e386c58\">\n<td data-local-id=\"3bd0981b81ec\">June 15<\/td>\n<td data-local-id=\"a9031690182d\"><a href=\"http:\/\/github.com\/owncloud\/web-extensions\/pull\/443\" target=\"_blank\" rel=\"noopener\">#443<\/a><\/td>\n<td data-local-id=\"1c0817ffabdf\">Apache-2.0 relicensing \u2014 foundation<\/td>\n<\/tr>\n<tr data-local-id=\"bb5d52163736\">\n<td data-local-id=\"3dd9a9081bac\">June 17<\/td>\n<td data-local-id=\"bf4d34b1c910\"><a href=\"http:\/\/github.com\/owncloud\/web-extensions\/pull\/452\" target=\"_blank\" rel=\"noopener\">#452<\/a><\/td>\n<td data-local-id=\"64313073ce5f\">Document summary<\/td>\n<\/tr>\n<tr data-local-id=\"e855ae3031fd\">\n<td data-local-id=\"85ee8ec0130a\">June 17<\/td>\n<td data-local-id=\"4eaa004d6ca7\"><a href=\"https:\/\/github.com\/owncloud\/web-extensions\/pull\/454\" target=\"_blank\" rel=\"noopener\">#454<\/a><\/td>\n<td data-local-id=\"a6d680ac6147\">Chat with file<\/td>\n<\/tr>\n<tr data-local-id=\"a88690b2dbee\">\n<td data-local-id=\"1aed011d720e\">June 18<\/td>\n<td data-local-id=\"d411d091ee29\"><a href=\"https:\/\/github.com\/owncloud\/web-extensions\/pull\/459\" target=\"_blank\" rel=\"noopener\">#459<\/a><\/td>\n<td data-local-id=\"c14c40b10c4b\">Version changelog<\/td>\n<\/tr>\n<tr data-local-id=\"3fb7ec8c9277\">\n<td data-local-id=\"412b2687e30e\">June 22<\/td>\n<td data-local-id=\"2f13f042bfb2\"><a href=\"https:\/\/github.com\/owncloud\/web-extensions\/pull\/467\" target=\"_blank\" rel=\"noopener\">#467<\/a><\/td>\n<td data-local-id=\"204b5ee6a738\">AI image alt text<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Find out more in the <a href=\"https:\/\/github.com\/owncloud\/web-extensions\/releases\/tag\/ai-image-alt-text-sidebar-v0.1.0\" target=\"_blank\" rel=\"noopener\">extension repository<\/a>.<br \/>\nFind this extension in the ownCloud Marketplace<\/p>\n<hr \/>\n<p><em><a href=\"https:\/\/github.com\/owncloud\/web-extensions\/pull\/467\" target=\"_blank\" rel=\"noopener\">github.com\/owncloud\/web-extensions\/pull\/467<\/a><\/em><br \/>\n<em>Lukas Hirt is a Collaborator on ownCloud web-extensions. PR #467 opened June 19, merged June 22, 2026.<br \/>\n<\/em><em>ownCloud OSPO:<\/em> ospo@kiteworks.com \u00b7 <a href=\"https:\/\/kiteworks.com\/opensource\" target=\"_blank\" rel=\"noopener\">kiteworks.com\/opensource<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Missing alt text is one of the most commonly flagged WCAG failures. EN 301 549 mandates it for public sector ICT across Europe. As of today, oCIS ships an extension that generates a credible first draft with your configured vision LLM, lets the user edit it, and writes it back to the file as a WebDAV property that survives the session. A meaningful compliance tool, not just a convenience feature.<\/p>\n","protected":false},"author":7,"featured_media":78665,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","inline_featured_image":false,"footnotes":""},"categories":[335,509,401,344,621,339,55,354,44],"tags":[],"class_list":["post-79846","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","category-infinite-scale","category-marketplace","category-opensource","category-ospo","category-owncloud","category-owncloud-product","category-release","category-updates"],"acf":[],"_links":{"self":[{"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/posts\/79846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/comments?post=79846"}],"version-history":[{"count":4,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/posts\/79846\/revisions"}],"predecessor-version":[{"id":79850,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/posts\/79846\/revisions\/79850"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/media\/78665"}],"wp:attachment":[{"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/media?parent=79846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/categories?post=79846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/owncloud.com\/de\/wp-json\/wp\/v2\/tags?post=79846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}