{"id":90,"date":"2026-03-18T18:22:48","date_gmt":"2026-03-18T18:22:48","guid":{"rendered":"https:\/\/medlearn.imperial.ac.uk\/innovation\/?page_id=90"},"modified":"2026-04-09T13:55:57","modified_gmt":"2026-04-09T13:55:57","slug":"ai-alt-text-generator","status":"publish","type":"page","link":"https:\/\/medlearn.imperial.ac.uk\/innovation\/projects\/ai-alt-text-generator\/","title":{"rendered":"AI Alt Text Generator"},"content":{"rendered":"\n<!-- BACK LINK + HEADER -->\n<div style=\"background:linear-gradient(to right,#001830,#003E74);padding:0;\">\n  <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1400 460\" style=\"width:100%;display:block;\">\n  <defs>\n    <linearGradient id=\"altBg\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n      <stop offset=\"0%\" stop-color=\"#001830\"\/>\n      <stop offset=\"100%\" stop-color=\"#003E74\"\/>\n    <\/linearGradient>\n    <linearGradient id=\"altCard\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n      <stop offset=\"0%\" stop-color=\"#ffffff\" stop-opacity=\"0.1\"\/>\n      <stop offset=\"100%\" stop-color=\"#ffffff\" stop-opacity=\"0.04\"\/>\n    <\/linearGradient>\n  <\/defs>\n  <rect width=\"1400\" height=\"460\" fill=\"url(#altBg)\"\/>\n  <!-- Grid -->\n  <g fill=\"#ffffff\" opacity=\"0.04\">\n    <line x1=\"0\" y1=\"92\" x2=\"1400\" y2=\"92\" stroke=\"#4A90D9\" stroke-width=\"0.5\" opacity=\"0.15\"\/>\n    <line x1=\"0\" y1=\"184\" x2=\"1400\" y2=\"184\" stroke=\"#4A90D9\" stroke-width=\"0.5\" opacity=\"0.15\"\/>\n    <line x1=\"0\" y1=\"276\" x2=\"1400\" y2=\"276\" stroke=\"#4A90D9\" stroke-width=\"0.5\" opacity=\"0.15\"\/>\n    <line x1=\"0\" y1=\"368\" x2=\"1400\" y2=\"368\" stroke=\"#4A90D9\" stroke-width=\"0.5\" opacity=\"0.15\"\/>\n    <line x1=\"280\" y1=\"0\" x2=\"280\" y2=\"460\" stroke=\"#4A90D9\" stroke-width=\"0.5\" opacity=\"0.15\"\/>\n    <line x1=\"560\" y1=\"0\" x2=\"560\" y2=\"460\" stroke=\"#4A90D9\" stroke-width=\"0.5\" opacity=\"0.15\"\/>\n    <line x1=\"840\" y1=\"0\" x2=\"840\" y2=\"460\" stroke=\"#4A90D9\" stroke-width=\"0.5\" opacity=\"0.15\"\/>\n    <line x1=\"1120\" y1=\"0\" x2=\"1120\" y2=\"460\" stroke=\"#4A90D9\" stroke-width=\"0.5\" opacity=\"0.15\"\/>\n  <\/g>\n  <!-- Image upload card (left) -->\n  <rect x=\"180\" y=\"90\" width=\"340\" height=\"260\" rx=\"12\" fill=\"url(#altCard)\" stroke=\"#4A90D9\" stroke-width=\"1.5\" opacity=\"0.5\"\/>\n  <!-- Image placeholder inside card -->\n  <rect x=\"210\" y=\"120\" width=\"280\" height=\"160\" rx=\"6\" fill=\"#0056a3\" opacity=\"0.25\"\/>\n  <rect x=\"210\" y=\"120\" width=\"280\" height=\"160\" rx=\"6\" fill=\"none\" stroke=\"#4A90D9\" stroke-width=\"1\" stroke-dasharray=\"6,4\" opacity=\"0.6\"\/>\n  <!-- Mountain\/image icon -->\n  <polygon points=\"280,240 320,190 360,240\" fill=\"#4A90D9\" opacity=\"0.5\"\/>\n  <polygon points=\"330,240 360,210 420,240\" fill=\"#4A90D9\" opacity=\"0.35\"\/>\n  <circle cx=\"390\" cy=\"195\" r=\"14\" fill=\"#4A90D9\" opacity=\"0.4\"\/>\n  <!-- Upload icon below -->\n  <text x=\"350\" y=\"302\" font-family=\"Arial,sans-serif\" font-size=\"11\" fill=\"#7DC4FF\" text-anchor=\"middle\" opacity=\"0.7\">Drag &amp; drop image<\/text>\n  <text x=\"350\" y=\"320\" font-family=\"Arial,sans-serif\" font-size=\"10\" fill=\"#4A90D9\" text-anchor=\"middle\" opacity=\"0.5\">or click to upload<\/text>\n  <!-- Arrow -->\n  <line x1=\"540\" y1=\"230\" x2=\"620\" y2=\"230\" stroke=\"#4A90D9\" stroke-width=\"2\" opacity=\"0.6\"\/>\n  <polygon points=\"615,223 630,230 615,237\" fill=\"#4A90D9\" opacity=\"0.6\"\/>\n  <!-- Claude AI processing circle -->\n  <circle cx=\"700\" cy=\"230\" r=\"58\" fill=\"#0056a3\" opacity=\"0.15\"\/>\n  <circle cx=\"700\" cy=\"230\" r=\"42\" fill=\"#0056a3\" opacity=\"0.2\"\/>\n  <circle cx=\"700\" cy=\"230\" r=\"28\" fill=\"#4A90D9\" opacity=\"0.25\"\/>\n  <text x=\"700\" y=\"236\" font-family=\"Arial,sans-serif\" font-size=\"16\" font-weight=\"bold\" fill=\"#7DC4FF\" text-anchor=\"middle\">AI<\/text>\n  <text x=\"700\" y=\"310\" font-family=\"Arial,sans-serif\" font-size=\"10\" fill=\"#4A90D9\" text-anchor=\"middle\" opacity=\"0.7\">Claude AI<\/text>\n  <!-- Arrow right -->\n  <line x1=\"770\" y1=\"230\" x2=\"850\" y2=\"230\" stroke=\"#4A90D9\" stroke-width=\"2\" opacity=\"0.6\"\/>\n  <polygon points=\"845,223 860,230 845,237\" fill=\"#4A90D9\" opacity=\"0.6\"\/>\n  <!-- Alt text output card (right) -->\n  <rect x=\"870\" y=\"90\" width=\"360\" height=\"260\" rx=\"12\" fill=\"url(#altCard)\" stroke=\"#4A90D9\" stroke-width=\"1.5\" opacity=\"0.5\"\/>\n  <text x=\"900\" y=\"130\" font-family=\"Arial,sans-serif\" font-size=\"10\" fill=\"#7DC4FF\" opacity=\"0.6\" letter-spacing=\"2\">ALT TEXT OUTPUT<\/text>\n  <!-- Text lines representing generated alt text -->\n  <rect x=\"900\" y=\"145\" width=\"290\" height=\"5\" rx=\"2.5\" fill=\"#ffffff\" opacity=\"0.35\"\/>\n  <rect x=\"900\" y=\"158\" width=\"260\" height=\"5\" rx=\"2.5\" fill=\"#ffffff\" opacity=\"0.3\"\/>\n  <rect x=\"900\" y=\"171\" width=\"280\" height=\"5\" rx=\"2.5\" fill=\"#ffffff\" opacity=\"0.25\"\/>\n  <rect x=\"900\" y=\"184\" width=\"200\" height=\"5\" rx=\"2.5\" fill=\"#ffffff\" opacity=\"0.2\"\/>\n  <!-- Quality badge -->\n  <rect x=\"900\" y=\"210\" width=\"80\" height=\"22\" rx=\"4\" fill=\"#4A90D9\" opacity=\"0.8\"\/>\n  <text x=\"940\" y=\"225\" font-family=\"Arial,sans-serif\" font-size=\"9\" fill=\"#fff\" text-anchor=\"middle\">Accessible<\/text>\n  <rect x=\"990\" y=\"210\" width=\"90\" height=\"22\" rx=\"4\" fill=\"#003E74\" opacity=\"0.9\" stroke=\"#4A90D9\" stroke-width=\"0.8\"\/>\n  <text x=\"1035\" y=\"225\" font-family=\"Arial,sans-serif\" font-size=\"9\" fill=\"#7DC4FF\" text-anchor=\"middle\">Context-aware<\/text>\n  <!-- Copy button -->\n  <rect x=\"900\" y=\"250\" width=\"80\" height=\"26\" rx=\"4\" fill=\"#ffffff\" opacity=\"0.1\" stroke=\"#4A90D9\" stroke-width=\"0.8\"\/>\n  <text x=\"940\" y=\"267\" font-family=\"Arial,sans-serif\" font-size=\"9\" fill=\"#7DC4FF\" text-anchor=\"middle\">Copy &#x2713;<\/text>\n  <!-- Title text -->\n  <text x=\"700\" y=\"415\" font-family=\"Arial,sans-serif\" font-size=\"13\" fill=\"#7DC4FF\" text-anchor=\"middle\" opacity=\"0.55\" letter-spacing=\"3\">AI ALT TEXT GENERATOR &mdash; ACCESSIBILITY TOOL<\/text>\n<\/svg>\n<\/div>\n\n<div style=\"max-width:960px;margin:0 auto;padding:40px 32px 64px 32px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;\">\n\n  <!-- BACK + TAGS -->\n  <div style=\"display:flex;align-items:center;gap:12px;margin-bottom:24px;flex-wrap:wrap;\">\n    <a href=\"\/innovation\/projects\/\" style=\"font-size:12px;color:#003E74;text-decoration:none;opacity:0.7;\">&larr; All Projects<\/a>\n    <span style=\"font-size:11px;background:#e8f0fa;color:#003E74;padding:4px 10px;border-radius:12px;font-weight:600;\">AI<\/span>\n    <span style=\"font-size:11px;background:#e8f0fa;color:#003E74;padding:4px 10px;border-radius:12px;font-weight:600;\">Accessibility<\/span>\n    <span style=\"font-size:11px;background:#e8f0fa;color:#003E74;padding:4px 10px;border-radius:12px;font-weight:600;\">EdTech<\/span>\n    <span style=\"font-size:11px;background:#f5f5f5;color:#666;padding:4px 10px;border-radius:12px;\">Proof of Concept<\/span>\n  <\/div>\n\n  <h1 style=\"font-size:34px;font-weight:800;color:#001E45;margin:0 0 8px 0;line-height:1.2;\">AI Alt Text Generator<\/h1>\n  <p style=\"font-size:17px;color:#003E74;margin:0 0 36px 0;font-weight:400;\">Automated accessibility descriptions for LMS images \u2014 built for learning technologists.<\/p>\n\n  <!-- OVERVIEW -->\n  <p style=\"font-size:15px;color:#333;line-height:1.8;margin:0 0 18px 0;\">Creating accessible digital learning environments requires every image uploaded to a VLE or LMS to carry descriptive alt text \u2014 a task that is time-consuming when done manually at scale. This proof-of-concept tool allows learning technologists to upload an image, provide optional course context, and receive a high-quality AI-generated description within seconds, ready to copy directly into Moodle, Blackboard, or any content authoring workflow.<\/p>\n  <p style=\"font-size:15px;color:#333;line-height:1.8;margin:0 0 40px 0;\">The tool was developed initially for <strong>Global Public Health<\/strong> courses at Imperial London, where complex data visualisations, infographics, and clinical diagrams are routinely used in online learning materials. By providing Claude AI with both the image and a course context field, the generated descriptions are not just generic &mdash; they reflect the academic register and content type of the material.<\/p>\n\n  <!-- PROJECT AT A GLANCE -->\n  <h2 style=\"font-size:20px;font-weight:700;color:#001E45;margin:0 0 16px 0;padding-bottom:8px;border-bottom:2px solid #e8eef5;\">Project at a Glance<\/h2>\n  <table style=\"width:100%;border-collapse:collapse;margin-bottom:40px;font-size:14px;\">\n    <tr style=\"border-bottom:1px solid #e8eef5;\">\n      <td style=\"padding:12px 16px;font-weight:600;color:#003E74;width:180px;vertical-align:top;\">Status<\/td>\n      <td style=\"padding:12px 16px;color:#333;\">Proof of Concept &mdash; active development<\/td>\n    <\/tr>\n    <tr style=\"border-bottom:1px solid #e8eef5;background:#f9fbfd;\">\n      <td style=\"padding:12px 16px;font-weight:600;color:#003E74;vertical-align:top;\">Primary Use Case<\/td>\n      <td style=\"padding:12px 16px;color:#333;\">Learning technologists uploading images to LMS \/ VLE platforms requiring WCAG-compliant alt text<\/td>\n    <\/tr>\n    <tr style=\"border-bottom:1px solid #e8eef5;\">\n      <td style=\"padding:12px 16px;font-weight:600;color:#003E74;vertical-align:top;\">Initial Context<\/td>\n      <td style=\"padding:12px 16px;color:#333;\">Global Public Health courses, Imperial London<\/td>\n    <\/tr>\n    <tr style=\"border-bottom:1px solid #e8eef5;background:#f9fbfd;\">\n      <td style=\"padding:12px 16px;font-weight:600;color:#003E74;vertical-align:top;\">Technology<\/td>\n      <td style=\"padding:12px 16px;color:#333;\">Vite &middot; React &middot; TypeScript &middot; Express.js &middot; Claude AI (Anthropic) &middot; Supabase &middot; Vercel<\/td>\n    <\/tr>\n    <tr style=\"border-bottom:1px solid #e8eef5;\">\n      <td style=\"padding:12px 16px;font-weight:600;color:#003E74;vertical-align:top;\">GitHub<\/td>\n      <td style=\"padding:12px 16px;color:#333;\"><a href=\"https:\/\/github.com\/adrianImperial\/ALT-text-web-tool\" style=\"color:#003E74;\">adrianImperial\/ALT-text-web-tool<\/a><\/td>\n    <\/tr>\n    <tr style=\"background:#f9fbfd;\">\n      <td style=\"padding:12px 16px;font-weight:600;color:#003E74;vertical-align:top;\">Year<\/td>\n      <td style=\"padding:12px 16px;color:#333;\">2024&ndash;25<\/td>\n    <\/tr>\n  <\/table>\n\n  <!-- HOW IT WORKS -->\n  <h2 style=\"font-size:20px;font-weight:700;color:#001E45;margin:0 0 16px 0;padding-bottom:8px;border-bottom:2px solid #e8eef5;\">How It Works<\/h2>\n  <p style=\"font-size:15px;color:#333;line-height:1.8;margin:0 0 18px 0;\">The workflow is deliberately simple. A learning technologist visits the tool, drags and drops an image (or selects it from their file system), and optionally adds a short note about the course topic or image context. Claude AI analyses the image and returns a structured alt text description optimised for screen reader compatibility and WCAG 2.1 AA compliance.<\/p>\n  <p style=\"font-size:15px;color:#333;line-height:1.8;margin:0 0 18px 0;\">The description can be copied with a single click for pasting into any LMS content editor. All generation requests and their outputs are stored in a Supabase database, giving teams a searchable log of previously generated descriptions &mdash; useful for audit purposes and to avoid duplicating effort when the same image appears across multiple course units.<\/p>\n  <p style=\"font-size:15px;color:#333;line-height:1.8;margin:0 0 40px 0;\">The Express.js backend handles image processing and API calls to Anthropic, keeping API keys server-side and ensuring the tool can be extended with authentication and usage quotas as needed for a production deployment.<\/p>\n\n  <!-- CONTEXT & MOTIVATION -->\n  <h2 style=\"font-size:20px;font-weight:700;color:#001E45;margin:0 0 16px 0;padding-bottom:8px;border-bottom:2px solid #e8eef5;\">Context &amp; Motivation<\/h2>\n  <p style=\"font-size:15px;color:#333;line-height:1.8;margin:0 0 18px 0;\">Accessibility in digital education is both a legal requirement and a quality standard. UK higher education institutions are required under the <strong>Public Sector Bodies Accessibility Regulations 2018<\/strong> to ensure online learning materials are accessible, which includes providing meaningful alt text for all non-decorative images. Despite this, manual alt text creation remains one of the most commonly skipped steps in LMS content workflows \u2014 primarily because it is slow and requires careful attention to each image&#8217;s pedagogic purpose.<\/p>\n  <p style=\"font-size:15px;color:#333;line-height:1.8;margin:0 0 40px 0;\">This tool tests whether AI can meaningfully reduce that friction. By combining Claude&#8217;s multimodal vision capabilities with a context prompt, the generated text goes beyond generic descriptions to reflect what the image is <em>for<\/em> in its academic context &mdash; for example distinguishing between a graph used to illustrate epidemiological trends versus one used to compare intervention outcomes, and writing alt text accordingly.<\/p>\n\n  <!-- BLOCKQUOTE -->\n  <blockquote style=\"border-left:4px solid #003E74;background:#f5f8fb;border-radius:0 6px 6px 0;padding:20px 24px;margin:0 0 40px 0;\">\n    <p style=\"font-size:15px;color:#003E74;line-height:1.7;margin:0;font-style:italic;\">&#8220;A fast, low-friction way to get proper alt text on every image &mdash; this is exactly the kind of tool learning technologists need to make accessibility genuinely manageable at scale.&#8221;<\/p>\n  <\/blockquote>\n\n  <!-- NEXT STEPS -->\n  <h2 style=\"font-size:20px;font-weight:700;color:#001E45;margin:0 0 16px 0;padding-bottom:8px;border-bottom:2px solid #e8eef5;\">Potential Next Steps<\/h2>\n  <p style=\"font-size:15px;color:#333;line-height:1.8;margin:0 0 18px 0;\">The current PoC demonstrates the core generation workflow. Possible directions for development include direct LMS integration (Moodle plugin or Blackboard Building Block), bulk image processing for retroactive accessibility remediation, a quality-scoring layer to flag descriptions that may need human review, and a faculty-facing version allowing academics to add context notes at point of upload during course build.<\/p>\n  <p style=\"font-size:15px;color:#333;line-height:1.8;margin:0 0 0 0;\">There is also potential to broaden the scope beyond Global Public Health to any department with high-volume image-rich course materials \u2014 medical imaging, histology slides, anatomy diagrams, data visualisations, and maps.<\/p>\n\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Drag &amp; drop image or click to upload AI Claude AI ALT TEXT OUTPUT Accessible Context-aware Copy &#x2713; AI ALT TEXT GENERATOR &mdash; ACCESSIBILITY TOOL &larr; All Projects AI Accessibility [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":0,"parent":7,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-90","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/pages\/90","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/comments?post=90"}],"version-history":[{"count":4,"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/pages\/90\/revisions"}],"predecessor-version":[{"id":261,"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/pages\/90\/revisions\/261"}],"up":[{"embeddable":true,"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/pages\/7"}],"wp:attachment":[{"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/media?parent=90"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}