{"id":194,"date":"2026-03-30T12:03:58","date_gmt":"2026-03-30T12:03:58","guid":{"rendered":"https:\/\/medlearn.imperial.ac.uk\/innovation\/?page_id=194"},"modified":"2026-04-13T16:55:29","modified_gmt":"2026-04-13T16:55:29","slug":"canvas-migration-bot","status":"publish","type":"page","link":"https:\/\/medlearn.imperial.ac.uk\/innovation\/canvas-migration-bot\/","title":{"rendered":"Canvas Migration Bot"},"content":{"rendered":"\n<!-- Canvas Migration Assistant \u2013 paste into WordPress Custom HTML block -->\n<!-- After Vercel deployment: replace VERCEL_API_URL with your live \/api\/chat endpoint -->\n<style>\n#cma-wrap *,#cma-wrap *::before,#cma-wrap *::after{box-sizing:border-box;margin:0;padding:0}\n#cma-wrap{\n  --ib:#003E74;--im:#005A9C;--il:#D4E8FF;--ia:#009CBC;\n  --tm:#1a1a1a;--tmu:#6b7280;--bg:#f4f6f9;--card:#fff;--bd:#e2e8f0;\n  --r:12px;\n  font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif;\n  max-width:780px;margin:0 auto;color:var(--tm);\n}\n#cma-header{display:flex;align-items:center;gap:12px;padding:18px 0 14px;border-bottom:2px solid var(--ib);margin-bottom:18px}\n#cma-logo{width:42px;height:42px;background:var(--ib);border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}\n#cma-logo svg{width:24px;height:24px}\n#cma-title h2{font-size:1.05rem;font-weight:700;color:var(--ib);line-height:1.2}\n#cma-title p{font-size:.78rem;color:var(--tmu);margin-top:2px}\n#cma-badge{margin-left:auto;background:var(--il);color:var(--ib);font-size:.7rem;font-weight:600;padding:4px 10px;border-radius:20px;white-space:nowrap}\n#cma-window{background:var(--card);border:1px solid var(--bd);border-radius:var(--r);display:flex;flex-direction:column;overflow:hidden;box-shadow:0 2px 8px rgba(0,0,0,.06);min-height:440px}\n#cma-msgs{flex:1;overflow-y:auto;padding:18px 14px;display:flex;flex-direction:column;gap:14px;scroll-behavior:smooth;max-height:520px}\n#cma-welcome{text-align:center;padding:28px 14px;color:var(--tmu)}\n#cma-welcome-icon{width:56px;height:56px;background:var(--il);border-radius:50%;display:flex;align-items:center;justify-content:center;margin:0 auto 12px}\n#cma-welcome-icon svg{width:28px;height:28px;color:var(--ib)}\n#cma-welcome h3{font-size:.95rem;font-weight:600;color:var(--ib);margin-bottom:5px}\n#cma-welcome p{font-size:.82rem;line-height:1.5;max-width:340px;margin:0 auto 18px}\n#cma-suggestions{display:flex;flex-wrap:wrap;gap:7px;justify-content:center}\n.cma-sq{background:var(--il);color:var(--ib);border:1px solid #b0cee8;border-radius:20px;padding:6px 13px;font-size:.75rem;font-weight:500;cursor:pointer;transition:background .15s}\n.cma-sq:hover{background:#c0ddf4}\n.cma-msg{display:flex;align-items:flex-start;gap:9px}\n.cma-msg.cma-user{flex-direction:row-reverse}\n.cma-av{width:30px;height:30px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:.7rem;font-weight:700;margin-top:2px}\n.cma-msg.cma-bot .cma-av{background:var(--ib);color:#fff}\n.cma-msg.cma-user .cma-av{background:var(--ia);color:#fff}\n.cma-bub{max-width:76%;padding:10px 14px;border-radius:14px;font-size:.855rem;line-height:1.6;word-break:break-word}\n.cma-msg.cma-bot .cma-bub{background:var(--bg);border:1px solid var(--bd);border-top-left-radius:4px;color:var(--tm)}\n.cma-msg.cma-user .cma-bub{background:var(--ib);color:#fff;border-top-right-radius:4px}\n.cma-bub strong{font-weight:600}\n.cma-bub ul,.cma-bub ol{padding-left:16px;margin:5px 0}\n.cma-bub li{margin-bottom:2px}\n.cma-bub a{color:var(--ia);text-decoration:underline}\n.cma-msg.cma-user .cma-bub a{color:#9dd4e8}\n.cma-bub p+p{margin-top:5px}\n.cma-bub h1,.cma-bub h2{font-size:.95rem;font-weight:700;color:var(--ib);margin:10px 0 4px}\n.cma-bub h3{font-size:.88rem;font-weight:700;color:var(--ib);margin:8px 0 3px}\n.cma-bub h4{font-size:.84rem;font-weight:600;margin:6px 0 2px}\n.cma-bub hr{border:none;border-top:1px solid var(--bd);margin:10px 0}\n.cma-tbl{border-collapse:collapse;width:100%;margin:8px 0;font-size:.8rem}\n.cma-tbl th,.cma-tbl td{border:1px solid var(--bd);padding:6px 10px;text-align:left;vertical-align:top}\n.cma-tbl th{background:var(--il);font-weight:600;color:var(--ib)}\n.cma-tbl tr:nth-child(even) td{background:#f8fafc}\n#cma-typing{display:none;padding:0 14px 10px}\n.cma-tdots{display:flex;gap:5px;align-items:center;background:var(--bg);border:1px solid var(--bd);border-radius:14px;border-top-left-radius:4px;padding:11px 15px;width:fit-content}\n.cma-dot{width:7px;height:7px;border-radius:50%;background:var(--tmu);animation:cmaBounce 1.2s infinite ease-in-out}\n.cma-dot:nth-child(2){animation-delay:.2s}\n.cma-dot:nth-child(3){animation-delay:.4s}\n@keyframes cmaBounce{0%,80%,100%{transform:translateY(0);opacity:.4}40%{transform:translateY(-5px);opacity:1}}\n#cma-input-bar{display:flex;align-items:center;gap:9px;padding:11px 13px;border-top:1px solid var(--bd);background:var(--card)}\n#cma-input{flex:1;border:1px solid var(--bd);border-radius:22px;padding:9px 15px;font-size:.855rem;font-family:inherit;color:var(--tm);outline:none;resize:none;line-height:1.4;max-height:110px;overflow-y:auto;background:var(--bg);transition:border-color .15s,box-shadow .15s}\n#cma-input:focus{border-color:var(--im);box-shadow:0 0 0 3px rgba(0,90,156,.12)}\n#cma-input::placeholder{color:var(--tmu)}\n#cma-send{width:38px;height:38px;border-radius:50%;border:none;background:var(--ib);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background .15s}\n#cma-send:hover:not(:disabled){background:var(--im)}\n#cma-send:disabled{background:var(--bd);cursor:not-allowed}\n#cma-send svg{width:17px;height:17px}\n#cma-footer{display:flex;justify-content:flex-end;margin-top:8px}\n#cma-clear{background:none;border:none;color:var(--tmu);font-size:.73rem;cursor:pointer;padding:3px 7px;border-radius:4px;transition:color .15s,background .15s}\n#cma-clear:hover{color:var(--ib);background:var(--il)}\n.cma-fb{display:flex;align-items:center;flex-wrap:wrap;gap:5px;margin-top:7px;padding-top:6px;border-top:1px solid var(--bd)}\n.cma-fb-prompt{font-size:.72rem;color:var(--tmu)}\n.cma-fb-btn{background:none;border:1px solid var(--bd);border-radius:20px;padding:2px 8px;font-size:.82rem;cursor:pointer;line-height:1.4;transition:background .12s,border-color .12s}\n.cma-fb-btn:hover:not(:disabled){background:var(--il);border-color:#b0cee8}\n.cma-fb-btn:disabled{opacity:.5;cursor:default}\n.cma-fb-form{display:none;flex-direction:column;gap:5px;width:100%;margin-top:4px}\n.cma-fb-ta{width:100%;border:1px solid var(--bd);border-radius:8px;padding:7px 10px;font-size:.78rem;font-family:inherit;color:var(--tm);background:var(--bg);resize:none;outline:none}\n.cma-fb-ta:focus{border-color:var(--im);box-shadow:0 0 0 2px rgba(0,90,156,.1)}\n.cma-fb-submit{align-self:flex-end;background:var(--ib);color:#fff;border:none;border-radius:20px;padding:5px 14px;font-size:.76rem;font-weight:600;cursor:pointer;transition:background .12s}\n.cma-fb-submit:hover{background:var(--im)}\n.cma-fb-thanks{font-size:.72rem;color:var(--ia);font-weight:600}\n@media(max-width:600px){#cma-badge{display:none}.cma-bub{max-width:88%}}\n<\/style>\n\n<div id=\"cma-wrap\">\n  <div id=\"cma-header\">\n    <div id=\"cma-logo\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2L2 7l10 5 10-5-10-5z\"\/><path d=\"M2 17l10 5 10-5\"\/><path d=\"M2 12l10 5 10-5\"\/><\/svg>\n    <\/div>\n    <div id=\"cma-title\">\n      <h2>Canvas Migration Assistant<\/h2>\n      <p>Imperial College London \u00b7 Faculty of Medicine<\/p>\n    <\/div>\n    <span id=\"cma-badge\">Staff Only<\/span>\n  <\/div>\n\n  <div id=\"cma-window\">\n    <div id=\"cma-msgs\">\n      <div id=\"cma-welcome\">\n        <div id=\"cma-welcome-icon\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\n        <\/div>\n        <h3>How can I help with your Canvas migration?<\/h3>\n        <p>Ask me anything about moving from Blackboard or Insendi to Canvas \u2014 feature mapping, naming conventions, module setup, and more.<\/p>\n        <div id=\"cma-suggestions\">\n          <button class=\"cma-sq\" data-q=\"How do I map my Insendi GOL activities to Canvas equivalents?\">Insendi \u2192 Canvas activity mapping<\/button>\n          <button class=\"cma-sq\" data-q=\"What are the current naming conventions for Canvas courses at Imperial?\">Course naming conventions<\/button>\n          <button class=\"cma-sq\" data-q=\"How does Blackboard's Grade Centre map to Canvas Gradebook?\">Grade Centre \u2192 Canvas Gradebook<\/button>\n          <button class=\"cma-sq\" data-q=\"Should we use the UK HE language pack or stick with Canvas default terminology?\">Courses vs Modules terminology<\/button>\n          <button class=\"cma-sq\" data-q=\"What Canvas tools are available to replace Padlet in Medicine?\">Padlet replacements in Canvas<\/button>\n          <button class=\"cma-sq\" data-q=\"How do I set up a Canvas module structure for a Medicine programme?\">Medicine programme structure<\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div id=\"cma-typing\">\n      <div style=\"display:flex;align-items:flex-start;gap:9px\">\n        <div class=\"cma-av\" style=\"background:#003E74;color:#fff\">AI<\/div>\n        <div class=\"cma-tdots\"><div class=\"cma-dot\"><\/div><div class=\"cma-dot\"><\/div><div class=\"cma-dot\"><\/div><\/div>\n      <\/div>\n    <\/div>\n\n    <div id=\"cma-input-bar\">\n      <textarea id=\"cma-input\" placeholder=\"Ask about your Canvas migration\u2026\" rows=\"1\"><\/textarea>\n      <button id=\"cma-send\" disabled aria-label=\"Send\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"\/><polygon points=\"22 2 15 22 11 13 2 9 22 2\"\/><\/svg>\n      <\/button>\n    <\/div>\n  <\/div>\n\n  <div id=\"cma-footer\">\n    <button id=\"cma-clear\">\u21ba Clear conversation<\/button>\n  <\/div>\n<\/div>\n\n<script src=\"https:\/\/canvas-migration-bot.vercel.app\/chatbot.js\"><\/script>\n\n<script>\n(function(){\n  var wrap = document.getElementById('cma-wrap');\n  if (!wrap) return;\n  wrap.style.display = 'none';\n  var loader = document.createElement('div');\n  loader.style.cssText = 'text-align:center;padding:80px 24px;font-size:15px;color:#999;font-style:italic;';\n  loader.textContent = 'Checking Imperial credentials\u2026';\n  wrap.parentNode.insertBefore(loader, wrap);\n  fetch('\/innovation\/wp-json\/wp\/v2\/users\/me', {credentials:'include'})\n    .then(function(r){\n      loader.remove();\n      if (r.ok) {\n        wrap.style.display = '';\n      } else {\n        var container = document.createElement('div');\n        container.style.cssText = 'max-width:480px;margin:60px auto;';\n        container.innerHTML = '<div style=\"background:#f7f9fc;border:1px solid #dde4ef;border-radius:12px;padding:60px 40px;text-align:center;\">'\n          + '<div style=\"width:56px;height:56px;border-radius:50%;background:#e8eef6;display:flex;align-items:center;justify-content:center;margin:0 auto 20px;\">'\n          + '<svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\"><rect x=\"5\" y=\"11\" width=\"14\" height=\"10\" rx=\"2\" stroke=\"#003E74\" stroke-width=\"1.8\"\/><path d=\"M8 11V7a4 4 0 1 1 8 0v4\" stroke=\"#003E74\" stroke-width=\"1.8\" stroke-linecap=\"round\"\/><\/svg>'\n          + '<\/div>'\n          + '<h2 style=\"color:#001E45;font-size:22px;font-weight:700;margin:0 0 14px;\">Imperial Login Required<\/h2>'\n          + '<p style=\"color:#555;font-size:15px;line-height:1.6;margin:0 0 28px;\">This tool is available to Imperial College London staff only. Please log in with your Imperial credentials to continue.<\/p>'\n          + '<a href=\"\/innovation\/wp-login.php?redirect_to=' + encodeURIComponent(window.location.origin + '\/innovation\/canvas-migration-bot\/') + '\" style=\"display:inline-block;background:#003E74;color:#fff;font-size:14px;font-weight:700;padding:13px 30px;border-radius:6px;text-decoration:none;letter-spacing:0.3px;\">Log in with Imperial &rarr;<\/a>'\n          + '<\/div>';\n        wrap.parentNode.insertBefore(container, wrap);\n      }\n    })\n    .catch(function(){\n      loader.remove();\n      wrap.style.display = '';\n    });\n})();\n<\/script>\n\n<script>\n\/* Canvas Bot \u2013 question logger v1 *\/\n(function(){\n  var SUPA_URL='https:\/\/aghrikkvomrovwkzfurm.supabase.co\/rest\/v1\/questions_log';\n  var SUPA_KEY='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImFnaHJpa2t2b21yb3Z3a3pmdXJtIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzQ4NzU0MjcsImV4cCI6MjA5MDQ1MTQyN30.bjS88CrZhUnASEZ1YroW5WHhC_2iEkuRVw7ojQ_4W2E';\n  var SESSION_ID=Math.random().toString(36).substring(2,10);\n  function logQuestion(q){if(!q)return;fetch(SUPA_URL,{method:'POST',headers:{'Content-Type':'application\/json','apikey':SUPA_KEY,'Authorization':'Bearer '+SUPA_KEY,'Prefer':'return=minimal'},body:JSON.stringify({question:q,session_id:SESSION_ID})}).catch(function(){});}\n  function attach(){var send=document.getElementById('cma-send');var input=document.getElementById('cma-input');if(!send||!input){setTimeout(attach,300);return;}send.addEventListener('click',function(){var q=input.value.trim();if(q)logQuestion(q);});input.addEventListener('keydown',function(e){if((e.key==='Enter'||e.keyCode===13)&&!e.shiftKey){var q=input.value.trim();if(q)logQuestion(q);}});}\n  if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',attach);}else{attach();}\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Canvas Migration Assistant Imperial College London \u00b7 Faculty of Medicine Staff Only How can I help with your Canvas migration? Ask me anything about moving from Blackboard or Insendi to [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-194","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/pages\/194","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=194"}],"version-history":[{"count":10,"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/pages\/194\/revisions"}],"predecessor-version":[{"id":298,"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/pages\/194\/revisions\/298"}],"wp:attachment":[{"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/media?parent=194"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}