summerise
python3 -c " import pdfplumber with pdfplumber.open('/home/daytona/workspace/attachments/dd37380b-6498-4cb0-89a4-c85c10040491/teleconsent_2016_contemporary clinical trials.pdf') as pdf: print(f'Total pages: {len(pdf.pages)}') text = '' for page in pdf.pages: text += page.extract_text() + '\n\n' print(text[:8000]) "
python3 -c " import pdfplumber with pdfplumber.open('/home/daytona/workspace/attachments/dd37380b-6498-4cb0-89a4-c85c10040491/teleconsent_2016_contemporary clinical trials.pdf') as pdf: text = '' for page in pdf.pages: text += page.extract_text() + '\n\n' print(text[8000:]) "
| Feature | Details |
|---|---|
| Real-time co-editing | Both researcher and participant view/interact with the document live |
| Electronic signature | Two options: "photo signature" (webcam snapshot + IP capture at signing) or free-draw on touchscreen |
| Security & Privacy | WebRTC peer-to-peer encryption; data never stored on a server; HIPAA-compliant |
| Document integrity | Hash value generated for each consent form; content locked after IRB approval |
| Audit trail | PDF includes field-by-field log of who entered data, when, and from where |
| Three-way calling | Supports legally authorized representatives (e.g. parent/spouse) joining remotely |
make 20 slide with main points
ls /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or missing"
mkdir -p /home/daytona/workspace/teleconsent-pptx
~/teleconsent-pptx/build.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Teleconsent: A Novel Approach to Informed Consent";
// ── Color palette ──────────────────────────────────────────────────────────
const C = {
navy: "0D2B45", // dominant dark
teal: "1A7A8A", // supporting
sky: "3DBCCC", // accent
white: "FFFFFF",
offwhite:"F0F6F8",
silver: "A8C5CC",
gray: "4A5568",
yellow: "F4D03F",
};
// ── Helper: add a full-bleed background rect ──────────────────────────────
function bg(slide, color) {
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color } });
}
// ── Helper: accent bar on the left ────────────────────────────────────────
function leftBar(slide, color = C.sky) {
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.12, h: 5.625, fill: { color } });
}
// ── Helper: section header band ───────────────────────────────────────────
function headerBand(slide, color = C.teal) {
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 1.1, fill: { color } });
}
// ── Helper: slide title in header band ────────────────────────────────────
function slideTitle(slide, text) {
slide.addText(text, {
x: 0.35, y: 0.15, w: 9.3, h: 0.8,
fontSize: 24, bold: true, color: C.white,
fontFace: "Calibri", valign: "middle",
});
}
// ── Helper: bullet list ───────────────────────────────────────────────────
function bulletList(slide, items, opts = {}) {
const { x = 0.45, y = 1.25, w = 9.1, h = 4.0, fontSize = 17 } = opts;
const arr = items.map((item, i) => ({
text: item,
options: { bullet: { type: "bullet" }, breakLine: i < items.length - 1, color: C.navy, fontSize, fontFace: "Calibri", paraSpaceAfter: 6 }
}));
slide.addText(arr, { x, y, w, h, valign: "top" });
}
// ── Helper: two-column layout ─────────────────────────────────────────────
function twoCol(slide, leftItems, rightItems, opts = {}) {
const { y = 1.3, h = 3.9, fontSize = 16 } = opts;
// divider
slide.addShape(pres.ShapeType.rect, { x: 5.1, y: 1.25, w: 0.03, h: h, fill: { color: C.silver } });
const makeArr = (items) => items.map((item, i) => ({
text: item,
options: { bullet: { type: "bullet" }, breakLine: i < items.length - 1, color: C.navy, fontSize, fontFace: "Calibri", paraSpaceAfter: 6 }
}));
slide.addText(makeArr(leftItems), { x: 0.45, y, w: 4.5, h, valign: "top" });
slide.addText(makeArr(rightItems), { x: 5.25, y, w: 4.4, h, valign: "top" });
}
// ── Helper: stat box ──────────────────────────────────────────────────────
function statBox(slide, number, label, x, y, w = 2.8, h = 2.0) {
slide.addShape(pres.ShapeType.rect, { x, y, w, h, fill: { color: C.navy }, line: { color: C.sky, pt: 2 } });
slide.addText(number, { x, y: y + 0.15, w, h: 1.0, fontSize: 38, bold: true, color: C.sky, align: "center", fontFace: "Calibri" });
slide.addText(label, { x, y: y + 1.1, w, h: 0.8, fontSize: 13, color: C.white, align: "center", fontFace: "Calibri", wrap: true });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 1 – Title
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.navy);
// decorative teal band top
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.08, fill: { color: C.sky } });
// decorative bottom band
s.addShape(pres.ShapeType.rect, { x: 0, y: 5.45, w: 10, h: 0.175, fill: { color: C.teal } });
// large accent circle
s.addShape(pres.ShapeType.ellipse, { x: 7.2, y: 0.6, w: 3.2, h: 3.2, fill: { color: C.teal }, line: { color: C.sky, pt: 2 } });
s.addShape(pres.ShapeType.ellipse, { x: 7.55, y: 0.95, w: 2.5, h: 2.5, fill: { color: C.navy }, line: { color: "FFFFFF", pt: 0 } });
// icon text inside circle
s.addText("📹", { x: 7.7, y: 1.5, w: 2.2, h: 1.4, fontSize: 52, align: "center" });
s.addText("TELECONSENT", {
x: 0.5, y: 1.1, w: 7, h: 0.7,
fontSize: 13, bold: true, color: C.sky, charSpacing: 6, fontFace: "Calibri",
});
s.addText("A Novel Approach to\nObtaining Informed Consent\nfor Research", {
x: 0.5, y: 1.7, w: 7, h: 2.0,
fontSize: 30, bold: true, color: C.white, fontFace: "Calibri", lineSpacingMultiple: 1.25,
});
s.addText("Welch et al. | Contemporary Clinical Trials Communications | 2016", {
x: 0.5, y: 4.9, w: 9, h: 0.4,
fontSize: 11, color: C.silver, fontFace: "Calibri", italic: true,
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 2 – The Recruitment Crisis
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "The Clinical Trial Recruitment Crisis");
statBox(s, "75%", "of trials FAIL to reach\nrecruitment goals", 0.4, 1.35);
statBox(s, "90%", "worldwide fail to enroll\nwithin allotted time", 3.6, 1.35);
statBox(s, "5%", "of invited participants\nactually complete trials", 6.8, 1.35);
s.addText("Failure to recruit leads to: costly time extensions · underpowered results · early termination", {
x: 0.4, y: 3.65, w: 9.2, h: 0.5,
fontSize: 13, italic: true, color: C.teal, align: "center", fontFace: "Calibri",
});
s.addShape(pres.ShapeType.rect, { x: 0.4, y: 3.6, w: 9.2, h: 0.01, fill: { color: C.silver } });
s.addText("Source: Welch et al., 2016 | Sung et al., JAMA 2003", {
x: 0.4, y: 5.2, w: 9.2, h: 0.3,
fontSize: 10, color: C.gray, italic: true, fontFace: "Calibri",
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 3 – Barriers to Informed Consent
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "Barriers to the Informed Consent Process");
leftBar(s);
bulletList(s, [
"Patient travel burden — especially for remote or rural participants",
"Scheduling difficulties between research staff and participants",
"Workflow disruptions in high-volume clinical sites",
"Difficulty understanding complex consent documents",
"Trials concentrated near investigators — geographic exclusion of eligible individuals",
"Training remote site staff is costly, disruptive, and error-prone",
"Existing remote options (phone, fax, mail) lack interactivity and verification",
], { fontSize: 16 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 4 – Limitations of Existing Solutions
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Limitations of Existing Remote Consent Methods");
const methods = [
["📞 Telephone", "No written documentation\nNo participant signature\nCannot verify identity"],
["📠 Fax / Mail", "Logistical burden on participant\nDelays in document return\nDifficult identity verification"],
["💻 eConsent", "Improves readability & management\nBut lacks live human interaction\nNo observation of nonverbal cues"],
];
methods.forEach(([title, body], i) => {
const x = 0.35 + i * 3.22;
s.addShape(pres.ShapeType.rect, { x, y: 1.2, w: 3.0, h: 4.0, fill: { color: C.navy }, line: { color: C.sky, pt: 1.5 } });
s.addText(title, { x, y: 1.2, w: 3.0, h: 0.7, fontSize: 15, bold: true, color: C.sky, align: "center", fontFace: "Calibri", valign: "middle" });
s.addShape(pres.ShapeType.rect, { x: x + 0.1, y: 1.88, w: 2.8, h: 0.03, fill: { color: C.teal } });
s.addText(body, { x: x + 0.15, y: 2.0, w: 2.7, h: 3.0, fontSize: 14, color: C.white, fontFace: "Calibri", valign: "top", lineSpacingMultiple: 1.4 });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 5 – What is Teleconsent?
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.navy);
s.addShape(pres.ShapeType.rect, { x: 0, y: 5.45, w: 10, h: 0.175, fill: { color: C.sky } });
s.addText("WHAT IS TELECONSENT?", {
x: 0.5, y: 0.5, w: 9, h: 0.6,
fontSize: 13, bold: true, color: C.sky, charSpacing: 5, fontFace: "Calibri",
});
s.addText(
"An informed consent process embedded into a live telemedicine video call — allowing researchers to remotely guide participants through consent documents in real time.",
{
x: 0.5, y: 1.1, w: 8.8, h: 1.5,
fontSize: 20, color: C.white, fontFace: "Calibri", lineSpacingMultiple: 1.4,
}
);
// three pillars
const pillars = [
[C.teal, "🎥 VIDEO", "Live face-to-face video call via telemedicine"],
[C.sky, "📄 DOCUMENT", "Interactive consent form shared in real time"],
[C.teal, "✍️ SIGN", "Legally compliant electronic signature captured"],
];
pillars.forEach(([color, head, body], i) => {
const x = 0.4 + i * 3.15;
s.addShape(pres.ShapeType.rect, { x, y: 2.85, w: 2.9, h: 2.5, fill: { color }, line: { color: C.white, pt: 0 } });
s.addText(head, { x, y: 2.88, w: 2.9, h: 0.65, fontSize: 15, bold: true, color: C.white, align: "center", fontFace: "Calibri", valign: "middle" });
s.addText(body, { x: x + 0.1, y: 3.55, w: 2.7, h: 1.7, fontSize: 13, color: C.white, align: "center", fontFace: "Calibri", valign: "middle", lineSpacingMultiple: 1.3 });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 6 – How It Works (Step by Step)
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "How Teleconsent Works — Step by Step");
const steps = [
["1", "Researcher shares a personalized Doxy.me URL with participant"],
["2", "Participant joins the waiting room (no login or software needed)"],
["3", "Researcher starts the video call and opens the consent document"],
["4", "Both parties scroll, highlight, and complete the form in real time"],
["5", "Participant can flag unclear sections for the researcher to explain"],
["6", "Researcher finalizes the document — PDF generated with audit trail"],
["7", "Both parties apply electronic signatures; PDF saved/archived"],
];
steps.forEach(([num, text], i) => {
const y = 1.2 + i * 0.6;
s.addShape(pres.ShapeType.ellipse, { x: 0.35, y: y + 0.04, w: 0.42, h: 0.42, fill: { color: C.teal } });
s.addText(num, { x: 0.35, y: y + 0.04, w: 0.42, h: 0.42, fontSize: 14, bold: true, color: C.white, align: "center", valign: "middle", fontFace: "Calibri" });
s.addText(text, { x: 0.9, y, w: 8.8, h: 0.55, fontSize: 15, color: C.navy, fontFace: "Calibri", valign: "middle" });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 7 – Real-Time Interactive Features
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Real-Time Interactive Features");
leftBar(s);
twoCol(s,
[
"Researcher scrolls document — updates on participant's screen instantly",
"Researcher can highlight text to direct participant's attention",
"Both users see each other's cursor position in real time",
"Researcher can fill in fields on behalf of participant (configurable)",
],
[
"Participant can highlight text they don't understand",
"HTML5 format supports text, images, audio, and video within the document",
"Three-way calls supported (e.g. for legally authorized representatives)",
"Text chat available throughout the call",
],
{ fontSize: 15 }
);
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 8 – Electronic Signature Options
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "Electronic Signature: Two Compliant Methods");
// Photo Signature box
s.addShape(pres.ShapeType.rect, { x: 0.4, y: 1.2, w: 4.3, h: 4.1, fill: { color: C.navy }, line: { color: C.sky, pt: 2 } });
s.addText("📷 Photo Signature", { x: 0.5, y: 1.2, w: 4.1, h: 0.75, fontSize: 16, bold: true, color: C.sky, align: "center", fontFace: "Calibri", valign: "middle" });
s.addShape(pres.ShapeType.rect, { x: 0.55, y: 1.93, w: 4.0, h: 0.03, fill: { color: C.teal } });
bulletList(s, [
"User types name → webcam snapshot taken at that moment",
"IP address, date & time captured",
"Provides legal identity verification without login",
"Complies with FDA 21 CFR Part 11",
], { x: 0.55, y: 2.05, w: 4.0, h: 3.1, fontSize: 14 });
// Free Draw box
s.addShape(pres.ShapeType.rect, { x: 5.3, y: 1.2, w: 4.3, h: 4.1, fill: { color: C.navy }, line: { color: C.sky, pt: 2 } });
s.addText("✏️ Free-Draw Signature", { x: 5.4, y: 1.2, w: 4.1, h: 0.75, fontSize: 16, bold: true, color: C.sky, align: "center", fontFace: "Calibri", valign: "middle" });
s.addShape(pres.ShapeType.rect, { x: 5.45, y: 1.93, w: 4.0, h: 0.03, fill: { color: C.teal } });
bulletList(s, [
"User draws signature with mouse or finger on touchscreen",
"Embedded signature box within the consent form",
"Works on mobile devices and tablets",
"Also complies with FDA 21 CFR Part 11",
], { x: 5.45, y: 2.05, w: 4.0, h: 3.1, fontSize: 14 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 9 – Document Management & Audit Trail
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Document Management & Audit Trail");
leftBar(s);
bulletList(s, [
"Consent documents coded in HTML5 — supports text, images, audio, and video",
"Documents locked after IRB approval; content cannot be changed once finalized",
"A hash value is generated for each document to verify no alterations were made",
"On finalization, a PDF is generated with a full audit trail: field name, user, role, timestamp, IP address",
"PDF saved locally to researcher's system (never stored on Teleconsent servers)",
"Template manager organizes Personal, Enterprise, and Global templates",
"Document metadata includes: study title, PI, IRB number, approval date, expiry",
], { fontSize: 15.5 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 10 – The Doxy.me Platform
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "Built on the Doxy.me Telemedicine Platform");
twoCol(s,
[
"Free web-based telemedicine platform (doxy.me)",
"Uses WebRTC — peer-to-peer encrypted audio/video",
"Works natively in Chrome and Firefox — no plugins needed",
"Mobile apps available for iOS and Android",
"Participants need no account, login, or software installation",
],
[
"HIPAA-compliant: encrypted data, no patient info stored, audit trail, BAA signed",
"Researcher provides personal URL (e.g. doxy.me/DrWelch)",
"Waiting room with customizable text, images, and video",
"Enterprise version allows white-labeling with organization branding",
"Teleconsent is an 'extension' built on top of the platform",
],
{ fontSize: 15 }
);
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 11 – Privacy & Security
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.navy);
s.addShape(pres.ShapeType.rect, { x: 0, y: 5.45, w: 10, h: 0.175, fill: { color: C.sky } });
s.addText("🔒 Privacy & Security", {
x: 0.5, y: 0.3, w: 9, h: 0.7,
fontSize: 26, bold: true, color: C.white, fontFace: "Calibri",
});
const items = [
["WebRTC encryption", "All data transmitted peer-to-peer between researcher and participant — same encryption as audio/video"],
["No server storage", "Consent form data exists only in users' browsers during the session — disappears when window is closed"],
["PDF responsibility", "Once finalized and saved, the PDF document is managed under the researcher's organizational policies"],
["HIPAA compliance", "Doxy.me signs a Business Associate Agreement (BAA); no patient data retained on platform servers"],
["Hash verification", "Each consent document has a hash value so users can confirm no changes were made after IRB approval"],
];
items.forEach(([heading, body], i) => {
const y = 1.1 + i * 0.87;
s.addShape(pres.ShapeType.rect, { x: 0.4, y: y + 0.05, w: 0.08, h: 0.5, fill: { color: C.sky } });
s.addText(heading + ": ", { x: 0.6, y, w: 2.5, h: 0.6, fontSize: 14, bold: true, color: C.sky, fontFace: "Calibri", valign: "middle" });
s.addText(body, { x: 3.15, y, w: 6.5, h: 0.6, fontSize: 13, color: C.white, fontFace: "Calibri", valign: "middle", wrap: true });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 12 – User Feedback & Focus Groups
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "Initial User Feedback — Focus Groups at MUSC");
// methodology box
s.addShape(pres.ShapeType.rect, { x: 0.35, y: 1.25, w: 3.2, h: 4.1, fill: { color: C.navy }, line: { color: C.sky, pt: 1.5 } });
s.addText("Methodology", { x: 0.35, y: 1.25, w: 3.2, h: 0.55, fontSize: 15, bold: true, color: C.sky, align: "center", fontFace: "Calibri", valign: "middle" });
bulletList(s, [
"2 focus groups with research coordinators",
"Dept of Obstetrics & Gynecology + SCTR",
"8–10 participants per group (~60 min each)",
"Live teleconsent demo followed by structured interview",
"Sessions recorded, transcribed, and analysed by dual reviewers",
], { x: 0.45, y: 1.85, w: 3.0, h: 3.4, fontSize: 13 });
// findings
s.addShape(pres.ShapeType.rect, { x: 3.85, y: 1.25, w: 5.8, h: 4.1, fill: { color: C.offwhite }, line: { color: C.teal, pt: 1.5 } });
s.addText("Key Findings", { x: 3.85, y: 1.25, w: 5.8, h: 0.55, fontSize: 15, bold: true, color: C.teal, align: "center", fontFace: "Calibri", valign: "middle" });
bulletList(s, [
"Almost all participants agreed teleconsent would be a \"time saver\"",
"Remote consenting & re-consenting seen as major benefit",
"Audit trails and photo signature praised for regulatory documentation",
"Minimising \"no-shows\" highlighted as a key advantage",
"Barriers: participant tech skills, connectivity, preference for in-person",
"Overall: perceived benefits far outweigh barriers",
], { x: 4.0, y: 1.85, w: 5.5, h: 3.4, fontSize: 13.5 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 13 – Advantages of Teleconsent
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Key Advantages of Teleconsent");
leftBar(s);
bulletList(s, [
"Reduces participant travel burden — particularly for rural and underserved populations",
"Enables nationwide and worldwide recruitment — critical for rare disease research",
"Researcher can observe nonverbal cues and address confusion in real time",
"Supports in-person-like interaction while maintaining remote convenience",
"Effective for multisite trials via a hub-and-spoke centralized consenting model",
"Can be integrated into online recruitment strategies (ResearchMatch, social media)",
"Allows instantaneous consent at the moment participants express interest",
"Supports re-consenting for protocol amendments without requiring travel",
], { fontSize: 15.5 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 14 – Multisite Trial Model
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "Hub-and-Spoke Model for Multisite Trials");
// Hub
s.addShape(pres.ShapeType.ellipse, { x: 3.8, y: 1.3, w: 2.4, h: 1.6, fill: { color: C.navy } });
s.addText("Central Hub\n(Trained Consenter)", { x: 3.8, y: 1.3, w: 2.4, h: 1.6, fontSize: 13, bold: true, color: C.sky, align: "center", valign: "middle", fontFace: "Calibri" });
// Spokes + remote sites
const sites = [
[0.3, 3.5, "Remote\nSite A"],
[2.2, 4.5, "Remote\nSite B"],
[4.6, 4.5, "Remote\nSite C"],
[7.0, 4.5, "Remote\nSite D"],
[8.4, 3.0, "Remote\nSite E"],
];
sites.forEach(([x, y, label]) => {
s.addShape(pres.ShapeType.rect, { x, y, w: 1.5, h: 1.0, fill: { color: C.teal }, line: { color: C.sky, pt: 1 } });
s.addText(label, { x, y, w: 1.5, h: 1.0, fontSize: 11, color: C.white, align: "center", valign: "middle", fontFace: "Calibri" });
// simple line (using thin rect as line approximation)
const cx = 4.8; const cy = 2.1;
const dx = (x + 0.75) - cx; const dy = (y + 0.5) - cy;
const len = Math.sqrt(dx*dx + dy*dy);
s.addShape(pres.ShapeType.rect, { x: cx, y: cy, w: len * 0.95, h: 0.03, fill: { color: C.silver } });
});
s.addText("One trained consenter at a central hub remotely obtains consent from all study sites via Teleconsent — eliminating per-site training and workflow disruption.", {
x: 0.35, y: 5.1, w: 9.3, h: 0.4,
fontSize: 12, color: C.gray, italic: true, fontFace: "Calibri",
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 15 – Teleconsent vs Other Remote Methods
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Teleconsent vs Other Remote Consent Approaches");
const rows = [
["Feature", "Telephone", "Mail / Fax", "eConsent", "Teleconsent"],
["Written document", "✗", "✓", "✓", "✓"],
["Participant signature", "✗", "✓", "✓", "✓"],
["Identity verification", "✗", "✗", "~", "✓"],
["Live interaction", "Audio only", "✗", "✗", "✓ Video"],
["Nonverbal cues", "✗", "✗", "✗", "✓"],
["Real-time guidance", "✗", "✗", "✗", "✓"],
["No travel required", "✓", "✓", "✓", "✓"],
["HIPAA compliant", "~", "~", "✓", "✓"],
];
const colW = [2.8, 1.5, 1.5, 1.5, 1.5];
const colX = [0.3, 3.15, 4.65, 6.15, 7.65];
rows.forEach((row, r) => {
row.forEach((cell, c) => {
const isHeader = r === 0;
const isLabelCol = c === 0;
const isTeleconsent = c === 4;
const fill = isHeader ? C.navy : (r % 2 === 0 ? C.offwhite : "E8F4F7");
const textColor = isHeader ? C.white : (isTeleconsent ? C.teal : C.navy);
s.addShape(pres.ShapeType.rect, { x: colX[c], y: 1.15 + r * 0.5, w: colW[c], h: 0.5, fill: { color: fill }, line: { color: C.silver, pt: 0.5 } });
s.addText(cell, { x: colX[c] + 0.05, y: 1.15 + r * 0.5, w: colW[c] - 0.1, h: 0.5, fontSize: isHeader ? 12 : 11.5, bold: isHeader || isLabelCol, color: textColor, fontFace: "Calibri", valign: "middle", align: isLabelCol ? "left" : "center" });
});
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 16 – Innovative Uses
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "Innovative Uses of Teleconsent");
leftBar(s);
twoCol(s,
[
"Three-way consent calls for studies requiring a Legally Authorized Representative (e.g. parent, spouse)",
"Research navigators can join remotely to support minority participant recruitment",
"Remote re-consenting when protocols are amended — no travel needed",
],
[
"Integration with online recruitment platforms (ResearchMatch, Facebook) — participants can consent immediately after expressing interest",
"Rare disease research — enables nationwide/worldwide recruitment where local enrollment is impossible",
"Community-based research in underserved areas using public internet access points",
],
{ fontSize: 15 }
);
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 17 – IRB Considerations
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Institutional Review Board (IRB) Considerations");
// IRB concerns
s.addShape(pres.ShapeType.rect, { x: 0.35, y: 1.25, w: 4.4, h: 4.1, fill: { color: "FFF3CD" }, line: { color: C.yellow, pt: 1.5 } });
s.addText("⚠ IRB Concerns", { x: 0.35, y: 1.25, w: 4.4, h: 0.6, fontSize: 15, bold: true, color: "856404", align: "center", fontFace: "Calibri", valign: "middle" });
bulletList(s, [
"Participant privacy and confidentiality",
"Integrity and verifiability of the consent document",
"Ability to remove/change templates if no longer valid",
"Technology access — not all participants own a computer or internet",
"Accessibility for special populations: elderly, adolescents, minorities",
], { x: 0.5, y: 1.9, w: 4.1, h: 3.3, fontSize: 13 });
// MUSC solutions
s.addShape(pres.ShapeType.rect, { x: 5.25, y: 1.25, w: 4.4, h: 4.1, fill: { color: "D4EDDA" }, line: { color: "28A745", pt: 1.5 } });
s.addText("✓ MUSC's Approach", { x: 5.25, y: 1.25, w: 4.4, h: 0.6, fontSize: 15, bold: true, color: "155724", align: "center", fontFace: "Calibri", valign: "middle" });
bulletList(s, [
"WebRTC encryption and no server data storage address privacy concerns",
"Hash verification and locked documents ensure integrity",
"IRB can delete/deactivate templates at any time",
"Pilot teleconsent sessions with target population to assess feasibility",
"Participants may use family/friend devices or public libraries as alternatives",
], { x: 5.4, y: 1.9, w: 4.1, h: 3.3, fontSize: 13 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 18 – Limitations
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Limitations of Teleconsent");
const limits = [
["💻 Technology Access", "Requires computer + reliable internet. 67% have home broadband; 13% smartphone-only. Digital divide exists but is smaller than often assumed — 62% of lower-SES individuals have broadband or smartphone access."],
["📱 Mobile Compatibility", "Tablet and smartphone compatibility was limited at publication. Larger screens also provide a better reading experience for consent documents."],
["😟 Participant Comfort", "Not all participants will feel comfortable consenting via video call. Teleconsent is a complement to — not a replacement for — in-person consent."],
["🏥 Institutional Overhead", "Requires IT support, organizational approval, and staff training — adding complexity above traditional paper consent."],
["⚙️ Workflow Gaps", "Lacked: (1) researcher-side consent authoring & IRB e-submission, and (2) automated capture of consent data (e.g. biospecimen permissions) into trial management systems."],
];
limits.forEach(([heading, body], i) => {
const y = 1.2 + i * 0.87;
s.addText(heading, { x: 0.4, y, w: 2.6, h: 0.75, fontSize: 13.5, bold: true, color: C.teal, fontFace: "Calibri", valign: "middle" });
s.addText(body, { x: 3.1, y, w: 6.6, h: 0.8, fontSize: 12.5, color: C.navy, fontFace: "Calibri", valign: "middle", wrap: true });
if (i < limits.length - 1) {
s.addShape(pres.ShapeType.rect, { x: 0.4, y: y + 0.82, w: 9.2, h: 0.02, fill: { color: C.silver } });
}
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 19 – Future Directions
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.navy);
s.addShape(pres.ShapeType.rect, { x: 0, y: 5.45, w: 10, h: 0.175, fill: { color: C.sky } });
s.addText("Future Directions", {
x: 0.5, y: 0.3, w: 9, h: 0.7,
fontSize: 26, bold: true, color: C.white, fontFace: "Calibri",
});
const future = [
["📊 Impact Studies", "Formal evaluation of teleconsent's effect on clinical trial recruitment rates and participant accrual"],
["⚖️ Comparative Research", "Head-to-head comparison of teleconsent vs traditional consent methods for participation and dropout rates"],
["🔗 eConsent Integration", "Combine teleconsent's interactive video features with eConsent's document management and computable data capture"],
["📝 Workflow Automation", "Add researcher-side IRB submission tools and automated capture of participant preferences (e.g. biospecimen use) as structured data"],
["📱 Mobile Enhancement", "Improve compatibility and user experience on smartphones and tablets for broader access"],
];
future.forEach(([icon_head, body], i) => {
const y = 1.1 + i * 0.87;
s.addShape(pres.ShapeType.rect, { x: 0.4, y: y + 0.1, w: 2.5, h: 0.6, fill: { color: C.teal } });
s.addText(icon_head, { x: 0.4, y: y + 0.1, w: 2.5, h: 0.6, fontSize: 13, bold: true, color: C.white, align: "center", valign: "middle", fontFace: "Calibri" });
s.addText(body, { x: 3.1, y, w: 6.6, h: 0.8, fontSize: 13, color: C.white, fontFace: "Calibri", valign: "middle", wrap: true });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 20 – Conclusion
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.navy);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.08, fill: { color: C.sky } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 5.45, w: 10, h: 0.175, fill: { color: C.teal } });
s.addText("Conclusion", {
x: 0.5, y: 0.3, w: 9, h: 0.65,
fontSize: 28, bold: true, color: C.white, fontFace: "Calibri",
});
const conclusions = [
"Teleconsent embeds informed consent into a live telemedicine video call, overcoming the access and travel barriers of traditional consent",
"It preserves the human interaction and nonverbal communication that makes in-person consent effective — remotely",
"Two legally compliant e-signature methods (photo + free-draw) provide identity verification without login barriers",
"Security: WebRTC encryption, HIPAA compliance, and no server storage protect participant data",
"Particularly beneficial for rural, underserved, rare-disease, and multisite trial recruitment",
"Teleconsent is a complement to — not a replacement of — in-person consent",
"Ongoing studies will quantify its impact on recruitment rates and compare it to traditional approaches",
];
const arr = conclusions.map((text, i) => ({
text,
options: { bullet: { type: "bullet" }, breakLine: i < conclusions.length - 1, color: C.white, fontSize: 14.5, fontFace: "Calibri", paraSpaceAfter: 5 }
}));
s.addText(arr, { x: 0.5, y: 1.05, w: 9, h: 4.25, valign: "top" });
s.addText("Welch BM et al. | Contemporary Clinical Trials Communications 3 (2016) 74–79", {
x: 0.5, y: 5.2, w: 9, h: 0.3,
fontSize: 10, color: C.silver, italic: true, fontFace: "Calibri",
});
}
// ─── Write file ────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/teleconsent-pptx/Teleconsent_Presentation.pptx" })
.then(() => console.log("Done: /home/daytona/workspace/teleconsent-pptx/Teleconsent_Presentation.pptx"))
.catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/teleconsent-pptx && node build.js 2>&1
Teleconsent Presentation
Presentation · PPTX
| # | Slide Title |
|---|---|
| 1 | Title slide |
| 2 | The Clinical Trial Recruitment Crisis (stat boxes) |
| 3 | Barriers to the Informed Consent Process |
| 4 | Limitations of Existing Remote Consent Methods |
| 5 | What is Teleconsent? |
| 6 | How Teleconsent Works - Step by Step |
| 7 | Real-Time Interactive Features |
| 8 | Electronic Signature: Two Compliant Methods |
| 9 | Document Management & Audit Trail |
| 10 | Built on the Doxy.me Platform |
| 11 | Privacy & Security |
| 12 | Initial User Feedback - Focus Groups at MUSC |
| 13 | Key Advantages of Teleconsent |
| 14 | Hub-and-Spoke Model for Multisite Trials |
| 15 | Teleconsent vs Other Remote Consent Approaches (comparison table) |
| 16 | Innovative Uses of Teleconsent |
| 17 | IRB Considerations (concerns vs. solutions) |
| 18 | Limitations |
| 19 | Future Directions |
| 20 | Conclusion |
Create a summary document I can share with colleagues
~/teleconsent-pptx/build_docx.js
const {
Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell,
Header, Footer, AlignmentType, HeadingLevel, BorderStyle, WidthType,
ShadingType, VerticalAlign, PageNumber, NumberFormat, UnderlineType,
TabStopType, TabStopPosition
} = require('docx');
const fs = require('fs');
// ── Color palette ──────────────────────────────────────────────────────────
const NAVY = "0D2B45";
const TEAL = "1A7A8A";
const SKY = "3DBCCC";
const LIGHT = "EBF6F8";
const YELLOW = "FFF9E6";
const GREEN = "E8F5E9";
const RED = "FFF3CD";
const SILVER = "D0E4E8";
const WHITE = "FFFFFF";
const GRAY = "4A5568";
// ── Helper: styled heading ─────────────────────────────────────────────────
function h1(text) {
return new Paragraph({
heading: HeadingLevel.HEADING_1,
spacing: { before: 320, after: 120 },
children: [
new TextRun({ text, bold: true, color: NAVY, size: 28, font: "Calibri" })
],
border: { bottom: { style: BorderStyle.SINGLE, size: 8, color: TEAL, space: 4 } },
});
}
function h2(text) {
return new Paragraph({
heading: HeadingLevel.HEADING_2,
spacing: { before: 240, after: 80 },
children: [
new TextRun({ text, bold: true, color: TEAL, size: 24, font: "Calibri" })
],
});
}
function h3(text) {
return new Paragraph({
spacing: { before: 180, after: 60 },
children: [
new TextRun({ text, bold: true, color: SKY, size: 22, font: "Calibri" })
],
});
}
function body(text, opts = {}) {
return new Paragraph({
spacing: { before: 60, after: 80, line: 276, lineRule: "auto" },
children: [
new TextRun({ text, size: 20, font: "Calibri", color: "2D2D2D", ...opts })
],
});
}
function bullet(text, bold_prefix = null) {
const runs = [];
if (bold_prefix) {
runs.push(new TextRun({ text: bold_prefix + " ", bold: true, size: 20, font: "Calibri", color: NAVY }));
runs.push(new TextRun({ text, size: 20, font: "Calibri", color: "2D2D2D" }));
} else {
runs.push(new TextRun({ text, size: 20, font: "Calibri", color: "2D2D2D" }));
}
return new Paragraph({
bullet: { level: 0 },
spacing: { before: 40, after: 40, line: 260, lineRule: "auto" },
children: runs,
});
}
function subbullet(text) {
return new Paragraph({
bullet: { level: 1 },
spacing: { before: 20, after: 20 },
children: [new TextRun({ text, size: 19, font: "Calibri", color: GRAY })],
});
}
function gap(size = 120) {
return new Paragraph({ spacing: { before: size, after: 0 }, children: [] });
}
function divider() {
return new Paragraph({
spacing: { before: 80, after: 80 },
border: { bottom: { style: BorderStyle.SINGLE, size: 4, color: SILVER, space: 4 } },
children: [],
});
}
// ── Shaded info box ────────────────────────────────────────────────────────
function infoBox(label, rows, fillColor = LIGHT) {
// Build as a 1-column table with header
return new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
margins: { top: 100, bottom: 100, left: 120, right: 120 },
rows: [
new TableRow({
children: [
new TableCell({
shading: { fill: NAVY, type: ShadingType.CLEAR },
verticalAlign: VerticalAlign.CENTER,
children: [
new Paragraph({
spacing: { before: 60, after: 60 },
children: [new TextRun({ text: label, bold: true, color: WHITE, size: 20, font: "Calibri" })]
})
],
borders: { top: { style: BorderStyle.NIL }, bottom: { style: BorderStyle.NIL }, left: { style: BorderStyle.NIL }, right: { style: BorderStyle.NIL } },
})
]
}),
...rows.map(row =>
new TableRow({
children: [
new TableCell({
shading: { fill: fillColor, type: ShadingType.CLEAR },
children: [
new Paragraph({
spacing: { before: 40, after: 40 },
bullet: { level: 0 },
children: [new TextRun({ text: row, size: 19, font: "Calibri", color: "2D2D2D" })]
})
],
borders: { top: { style: BorderStyle.NIL }, bottom: { style: BorderStyle.NIL }, left: { style: BorderStyle.NIL }, right: { style: BorderStyle.NIL } },
})
]
})
)
],
});
}
// ── Comparison table ───────────────────────────────────────────────────────
function comparisonTable() {
const headers = ["Feature", "Telephone", "Mail / Fax", "eConsent", "Teleconsent"];
const dataRows = [
["Written document", "✗", "✓", "✓", "✓"],
["Participant signature", "✗", "✓", "✓", "✓"],
["Identity verification", "✗", "✗", "Partial", "✓"],
["Live interaction", "Audio only", "✗", "✗", "✓ Video"],
["Nonverbal cues", "✗", "✗", "✗", "✓"],
["Real-time guidance", "✗", "✗", "✗", "✓"],
["No travel required", "✓", "✓", "✓", "✓"],
["HIPAA compliant", "Partial", "Partial", "✓", "✓"],
];
const colWidths = [2600, 1200, 1200, 1200, 1200];
function headerCell(text) {
return new TableCell({
shading: { fill: NAVY, type: ShadingType.CLEAR },
verticalAlign: VerticalAlign.CENTER,
width: { size: colWidths[headers.indexOf(text)] || 1200, type: WidthType.DXA },
children: [new Paragraph({
spacing: { before: 60, after: 60 },
alignment: AlignmentType.CENTER,
children: [new TextRun({ text, bold: true, color: WHITE, size: 18, font: "Calibri" })]
})],
borders: { top: { style: BorderStyle.SINGLE, size: 4, color: SKY }, bottom: { style: BorderStyle.SINGLE, size: 4, color: SKY }, left: { style: BorderStyle.SINGLE, size: 4, color: SKY }, right: { style: BorderStyle.SINGLE, size: 4, color: SKY } },
});
}
function dataCell(text, isTeleconsent = false, isLabel = false) {
const fill = isTeleconsent ? LIGHT : WHITE;
return new TableCell({
shading: { fill, type: ShadingType.CLEAR },
verticalAlign: VerticalAlign.CENTER,
children: [new Paragraph({
spacing: { before: 50, after: 50 },
alignment: isLabel ? AlignmentType.LEFT : AlignmentType.CENTER,
children: [new TextRun({
text,
size: 18,
font: "Calibri",
color: isTeleconsent ? TEAL : "2D2D2D",
bold: isLabel || isTeleconsent,
})]
})],
borders: { top: { style: BorderStyle.SINGLE, size: 2, color: SILVER }, bottom: { style: BorderStyle.SINGLE, size: 2, color: SILVER }, left: { style: BorderStyle.SINGLE, size: 2, color: SILVER }, right: { style: BorderStyle.SINGLE, size: 2, color: SILVER } },
});
}
return new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
rows: [
new TableRow({ children: headers.map(h => headerCell(h)) }),
...dataRows.map(row =>
new TableRow({
children: row.map((cell, i) => dataCell(cell, i === 4, i === 0))
})
)
],
});
}
// ── Key statistics table ────────────────────────────────────────────────────
function statsTable() {
const stats = [
["75%", "of clinical trials fail to reach their recruitment goals"],
["90%", "of trials worldwide fail to enroll within the allotted time"],
["5%", "of invited participants actually complete a clinical trial"],
["21%", "of invited individuals even show up for initial screening"],
];
return new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
rows: stats.map(([stat, desc], i) =>
new TableRow({
children: [
new TableCell({
shading: { fill: i % 2 === 0 ? NAVY : TEAL, type: ShadingType.CLEAR },
width: { size: 1400, type: WidthType.DXA },
verticalAlign: VerticalAlign.CENTER,
children: [new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { before: 80, after: 80 },
children: [new TextRun({ text: stat, bold: true, color: WHITE, size: 40, font: "Calibri" })]
})],
borders: { top: { style: BorderStyle.NIL }, bottom: { style: BorderStyle.SINGLE, size: 2, color: SKY }, left: { style: BorderStyle.NIL }, right: { style: BorderStyle.NIL } },
}),
new TableCell({
shading: { fill: LIGHT, type: ShadingType.CLEAR },
verticalAlign: VerticalAlign.CENTER,
children: [new Paragraph({
spacing: { before: 80, after: 80 },
children: [new TextRun({ text: desc, size: 20, font: "Calibri", color: "2D2D2D" })]
})],
borders: { top: { style: BorderStyle.NIL }, bottom: { style: BorderStyle.SINGLE, size: 2, color: SKY }, left: { style: BorderStyle.NIL }, right: { style: BorderStyle.NIL } },
}),
]
})
),
});
}
// ═══════════════════════════════════════════════════════════════════════════
// BUILD DOCUMENT
// ═══════════════════════════════════════════════════════════════════════════
const doc = new Document({
creator: "Orris AI",
title: "Teleconsent Summary",
description: "Summary of Welch et al. 2016 - Teleconsent: A Novel Approach to Obtain Informed Consent for Research",
styles: {
default: {
document: {
run: { font: "Calibri", size: 20 },
paragraph: { spacing: { line: 276, lineRule: "auto" } },
}
}
},
sections: [
{
properties: {
page: {
margin: { top: 900, bottom: 900, left: 1080, right: 1080 },
}
},
headers: {
default: new Header({
children: [
new Paragraph({
alignment: AlignmentType.RIGHT,
spacing: { before: 0, after: 100 },
border: { bottom: { style: BorderStyle.SINGLE, size: 6, color: TEAL, space: 4 } },
children: [
new TextRun({ text: "TELECONSENT ", bold: true, color: NAVY, size: 18, font: "Calibri" }),
new TextRun({ text: "| Welch et al., Contemporary Clinical Trials Communications, 2016", color: GRAY, size: 17, font: "Calibri" }),
]
})
]
})
},
footers: {
default: new Footer({
children: [
new Paragraph({
alignment: AlignmentType.CENTER,
border: { top: { style: BorderStyle.SINGLE, size: 6, color: TEAL, space: 4 } },
spacing: { before: 80, after: 0 },
children: [
new TextRun({ text: "Page ", size: 17, color: GRAY, font: "Calibri" }),
new TextRun({ children: [new PageNumber()], size: 17, color: GRAY, font: "Calibri" }),
new TextRun({ text: " | Confidential Summary — For Colleague Distribution", size: 17, color: GRAY, font: "Calibri" }),
]
})
]
})
},
children: [
// ── TITLE BLOCK ───────────────────────────────────────────────────
new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { before: 200, after: 60 },
children: [
new TextRun({ text: "TELECONSENT", bold: true, color: NAVY, size: 48, font: "Calibri", characterSpacing: 80 }),
]
}),
new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { before: 0, after: 60 },
children: [
new TextRun({ text: "A Novel Approach to Obtaining Informed Consent for Research", bold: true, color: TEAL, size: 26, font: "Calibri" }),
]
}),
new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { before: 40, after: 40 },
children: [
new TextRun({ text: "Welch BM, Marshall E, Qanungo S, Aziz A, Laken M, Lenert L, Obeid J", color: GRAY, size: 19, font: "Calibri", italics: true }),
]
}),
new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { before: 20, after: 200 },
children: [
new TextRun({ text: "Contemporary Clinical Trials Communications, Vol. 3, pp. 74–79, 2016", color: GRAY, size: 18, font: "Calibri" }),
]
}),
divider(),
// ── 1. BACKGROUND ─────────────────────────────────────────────────
h1("1. Background & Problem"),
body("Clinical trials are central to advancing healthcare, but recruiting qualified participants remains a critical bottleneck. The informed consent process — a mandatory step before enrolment — contributes significantly to this problem due to travel burden, scheduling complexity, and geographic constraints."),
gap(80),
h2("Recruitment by the Numbers"),
statsTable(),
gap(100),
h2("Key Barriers to Informed Consent"),
bullet("Patient travel burden — especially for those living far from the investigator site"),
bullet("Scheduling difficulties between research staff and prospective participants"),
bullet("Workflow disruption in high-volume clinical sites when staff are trained to obtain consent"),
bullet("Difficulty understanding complex consent documents"),
bullet("Geographic exclusion — trials concentrate near investigators, limiting access for distant individuals"),
bullet("Remote site staff training is costly, disruptive, and prone to errors and incomplete consents"),
gap(60),
h2("Limitations of Existing Remote Options"),
bullet("Telephone:", "No written documentation, no signature, no identity verification"),
bullet("Mail / Fax:", "Logistically burdensome; participant must sign and return; identity hard to verify"),
bullet("eConsent:", "Improves readability and document management, but lacks live human interaction and cannot detect nonverbal confusion"),
divider(),
// ── 2. WHAT IS TELECONSENT ────────────────────────────────────────
h1("2. What is Teleconsent?"),
body("Teleconsent is a telemedicine-inspired solution that embeds the informed consent process into a live video call. Developed at the Medical University of South Carolina (MUSC) as an extension to the Doxy.me platform, it allows a researcher to remotely and interactively guide a participant through a consent form in real time — preserving the benefits of in-person interaction while eliminating travel."),
gap(80),
infoBox("Core Concept", [
"Researcher and participant connect via a HIPAA-compliant video call (Doxy.me)",
"An HTML5 consent document is shared on-screen and completed together in real time",
"Both parties can scroll, highlight, edit form fields, and observe each other's cursor",
"On completion, a signed PDF with full audit trail is generated and saved locally",
], LIGHT),
divider(),
// ── 3. KEY FEATURES ───────────────────────────────────────────────
h1("3. Key Features"),
h2("Real-Time Interactive Document"),
bullet("Consent form coded in HTML5 — supports text, images, audio, and video"),
bullet("Researcher scrolls the document — participant's screen updates instantly"),
bullet("Both parties see each other's cursor position in real time"),
bullet("Researcher can highlight sections and direct the participant's attention"),
bullet("Participant can highlight text they do not understand for clarification"),
bullet("Researcher can fill in form fields on behalf of the participant (configurable per field)"),
gap(60),
h2("Electronic Signatures — Two Compliant Methods"),
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
rows: [
new TableRow({
children: [
new TableCell({
shading: { fill: NAVY, type: ShadingType.CLEAR },
children: [new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 80, after: 80 }, children: [new TextRun({ text: "Photo Signature", bold: true, color: SKY, size: 20, font: "Calibri" })] })],
borders: { top: { style: BorderStyle.NIL }, bottom: { style: BorderStyle.SINGLE, size: 4, color: SKY }, left: { style: BorderStyle.NIL }, right: { style: BorderStyle.SINGLE, size: 4, color: SILVER }, },
}),
new TableCell({
shading: { fill: NAVY, type: ShadingType.CLEAR },
children: [new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 80, after: 80 }, children: [new TextRun({ text: "Free-Draw Signature", bold: true, color: SKY, size: 20, font: "Calibri" })] })],
borders: { top: { style: BorderStyle.NIL }, bottom: { style: BorderStyle.SINGLE, size: 4, color: SKY }, left: { style: BorderStyle.NIL }, right: { style: BorderStyle.NIL } },
}),
]
}),
new TableRow({
children: [
new TableCell({
shading: { fill: LIGHT, type: ShadingType.CLEAR },
children: [
new Paragraph({ bullet: { level: 0 }, spacing: { before: 40, after: 30 }, children: [new TextRun({ text: "User types name → webcam snapshot taken at signing", size: 19, font: "Calibri" })] }),
new Paragraph({ bullet: { level: 0 }, spacing: { before: 30, after: 30 }, children: [new TextRun({ text: "Captures IP address, date, and time", size: 19, font: "Calibri" })] }),
new Paragraph({ bullet: { level: 0 }, spacing: { before: 30, after: 30 }, children: [new TextRun({ text: "Legal identity verification without account login", size: 19, font: "Calibri" })] }),
new Paragraph({ bullet: { level: 0 }, spacing: { before: 30, after: 40 }, children: [new TextRun({ text: "FDA 21 CFR Part 11 compliant", size: 19, font: "Calibri" })] }),
],
borders: { top: { style: BorderStyle.NIL }, bottom: { style: BorderStyle.NIL }, left: { style: BorderStyle.NIL }, right: { style: BorderStyle.SINGLE, size: 4, color: SILVER } },
}),
new TableCell({
shading: { fill: LIGHT, type: ShadingType.CLEAR },
children: [
new Paragraph({ bullet: { level: 0 }, spacing: { before: 40, after: 30 }, children: [new TextRun({ text: "User draws signature with mouse or finger", size: 19, font: "Calibri" })] }),
new Paragraph({ bullet: { level: 0 }, spacing: { before: 30, after: 30 }, children: [new TextRun({ text: "Embedded signature box within the consent form", size: 19, font: "Calibri" })] }),
new Paragraph({ bullet: { level: 0 }, spacing: { before: 30, after: 30 }, children: [new TextRun({ text: "Works on mobile and touchscreen devices", size: 19, font: "Calibri" })] }),
new Paragraph({ bullet: { level: 0 }, spacing: { before: 30, after: 40 }, children: [new TextRun({ text: "Also FDA 21 CFR Part 11 compliant", size: 19, font: "Calibri" })] }),
],
borders: { top: { style: BorderStyle.NIL }, bottom: { style: BorderStyle.NIL }, left: { style: BorderStyle.NIL }, right: { style: BorderStyle.NIL } },
}),
]
}),
],
}),
gap(60),
h2("Document Integrity & Audit Trail"),
bullet("Documents locked after IRB approval — content cannot be altered"),
bullet("A cryptographic hash value is generated for each consent document to detect any tampering"),
bullet("On finalization, a PDF is produced containing a full audit trail: field name, user, role, timestamp, and IP address"),
bullet("PDF is saved to the researcher's own system — data never stored on Teleconsent servers"),
gap(60),
h2("The Doxy.me Platform"),
bullet("Free, web-based telemedicine platform using WebRTC peer-to-peer encryption"),
bullet("Works natively in Chrome and Firefox — no software downloads or plugins needed"),
bullet("Participants require no account or login to join a session"),
bullet("HIPAA-compliant: encrypted transmission, no patient data retained, Business Associate Agreement signed"),
bullet("Enterprise version supports white-labeling with organizational branding"),
bullet("Three-way calling supported — useful when a legally authorized representative must co-sign"),
divider(),
// ── 4. COMPARISON TABLE ───────────────────────────────────────────
h1("4. Teleconsent vs Other Remote Consent Methods"),
gap(60),
comparisonTable(),
gap(80),
body("Teleconsent combines the convenience of remote access with the interpersonal quality of in-person consent — addressing the key gap left by eConsent tools.", { italics: true, color: TEAL }),
divider(),
// ── 5. ADVANTAGES ─────────────────────────────────────────────────
h1("5. Key Advantages"),
h2("For Participant Access & Diversity"),
bullet("Reduces travel burden for rural, underserved, and geographically remote participants"),
bullet("Enables nationwide and worldwide recruitment — essential for rare disease research"),
bullet("Supports participation by lower-income groups who have smartphone or community internet access"),
h2("For Research Teams"),
bullet("Researcher can observe nonverbal cues and address confusion in real time — impossible with eConsent"),
bullet("Remote re-consenting for protocol amendments without requiring participant travel"),
bullet("Reduces scheduling burden and minimises 'no-shows'"),
bullet("Robust audit trail supports regulatory and compliance documentation"),
h2("For Multisite Trials"),
bullet("Hub-and-spoke model: a single trained consenter at a central location can remotely consent participants across all sites"),
bullet("Eliminates the need to train clinical staff at each remote site"),
bullet("Reduces incomplete or erroneous consents caused by undertrained site staff"),
bullet("Provides a standardized, controlled consent experience across all sites"),
h2("For Online Recruitment"),
bullet("Pairs with online platforms (e.g. ResearchMatch, Facebook) so interested participants can consent immediately"),
bullet("Removes the gap between online interest and traditional in-person consent appointment"),
divider(),
// ── 6. USER FEEDBACK ──────────────────────────────────────────────
h1("6. User Feedback — Focus Groups at MUSC"),
body("Two focus groups were conducted with research coordinators from the Department of Obstetrics & Gynecology and the South Carolina Translational Research (SCTR) unit (8–10 participants each, ~60 minutes per group). Sessions included a live teleconsent demonstration followed by structured qualitative interviews."),
gap(80),
infoBox("Key Findings", [
"Almost all participants agreed teleconsent would be a 'time saver'",
"Remote consenting and re-consenting seen as a major practical benefit",
"Audit trails and photo signature praised for regulatory documentation purposes",
"Minimising 'no-shows' highlighted as a significant advantage",
"Barriers identified: participant tech skills, internet connectivity, preference for in-person meetings",
"Overall: perceived benefits far outweigh the identified barriers",
], LIGHT),
divider(),
// ── 7. IRB CONSIDERATIONS ─────────────────────────────────────────
h1("7. IRB Considerations"),
body("As teleconsent is a new approach to informed consent, IRB approval is required before use. Based on MUSC's experience, IRBs have raised the following concerns — along with how teleconsent addresses them:"),
gap(80),
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
rows: [
new TableRow({
children: [
new TableCell({
shading: { fill: NAVY, type: ShadingType.CLEAR },
children: [new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 80, after: 80 }, children: [new TextRun({ text: "IRB Concern", bold: true, color: WHITE, size: 20, font: "Calibri" })] })],
width: { size: 45, type: WidthType.PERCENTAGE },
borders: { top: { style: BorderStyle.NIL }, bottom: { style: BorderStyle.SINGLE, size: 4, color: SKY }, left: { style: BorderStyle.NIL }, right: { style: BorderStyle.SINGLE, size: 4, color: SILVER } },
}),
new TableCell({
shading: { fill: NAVY, type: ShadingType.CLEAR },
children: [new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 80, after: 80 }, children: [new TextRun({ text: "Teleconsent Response", bold: true, color: WHITE, size: 20, font: "Calibri" })] })],
width: { size: 55, type: WidthType.PERCENTAGE },
borders: { top: { style: BorderStyle.NIL }, bottom: { style: BorderStyle.SINGLE, size: 4, color: SKY }, left: { style: BorderStyle.NIL }, right: { style: BorderStyle.NIL } },
}),
]
}),
...[
["Participant privacy and confidentiality", "WebRTC encryption; no data stored on servers; data exists only in users' browsers during session"],
["Integrity and verifiability of consent document", "Hash value generated per document; content locked after IRB approval"],
["Ability to remove invalid templates", "IRB can deactivate or delete templates at any time via the template manager"],
["Technology access barriers", "Pilot sessions with target population recommended; public libraries and community centres as alternatives"],
["Accessibility for special populations (elderly, adolescents, minorities)", "Pilot testing approach used at MUSC has proven effective for identifying issues early"],
].map(([concern, response], i) =>
new TableRow({
children: [
new TableCell({
shading: { fill: i % 2 === 0 ? "#FFF9E6" : "#FFFDF0", type: ShadingType.CLEAR },
children: [new Paragraph({ spacing: { before: 60, after: 60 }, children: [new TextRun({ text: concern, size: 19, font: "Calibri", color: "5D4037" })] })],
borders: { top: { style: BorderStyle.NIL }, bottom: { style: BorderStyle.SINGLE, size: 2, color: SILVER }, left: { style: BorderStyle.NIL }, right: { style: BorderStyle.SINGLE, size: 2, color: SILVER } },
}),
new TableCell({
shading: { fill: i % 2 === 0 ? GREEN : "#F1F8F2", type: ShadingType.CLEAR },
children: [new Paragraph({ spacing: { before: 60, after: 60 }, children: [new TextRun({ text: response, size: 19, font: "Calibri", color: "1B5E20" })] })],
borders: { top: { style: BorderStyle.NIL }, bottom: { style: BorderStyle.SINGLE, size: 2, color: SILVER }, left: { style: BorderStyle.NIL }, right: { style: BorderStyle.NIL } },
}),
]
})
)
],
}),
divider(),
// ── 8. LIMITATIONS ────────────────────────────────────────────────
h1("8. Limitations"),
bullet("Technology access:", "Requires a computer or device with reliable internet. While most participants have access (67% with home broadband; 62% of lower-SES individuals have broadband or smartphone), a digital divide remains."),
bullet("Mobile compatibility:", "Tablet and smartphone support was limited at publication. Larger screens are preferred for reading consent documents."),
bullet("Participant comfort:", "Not all participants will feel comfortable consenting by video. Teleconsent is a complement to in-person consent — not a replacement."),
bullet("Institutional overhead:", "Requires IT support, organizational approval, and staff training, which may add complexity above traditional paper consent."),
bullet("Workflow gaps:", "Lacked automated consent authoring and IRB e-submission tools, and automated capture of participant preferences (e.g. biospecimen permissions) as structured data elements."),
divider(),
// ── 9. FUTURE DIRECTIONS ──────────────────────────────────────────
h1("9. Future Directions"),
body("At time of publication, the following studies were underway or planned:"),
gap(60),
bullet("Formal evaluation of teleconsent's impact on clinical trial recruitment and accrual rates"),
bullet("Head-to-head comparison of teleconsent vs traditional consent methods"),
bullet("Integration of teleconsent features with eConsent platforms for combined benefits"),
bullet("Workflow automation: researcher-side IRB submission tools and automated data capture"),
bullet("Improved mobile and tablet compatibility for broader access"),
divider(),
// ── 10. CONCLUSION ────────────────────────────────────────────────
h1("10. Conclusion"),
new Paragraph({
spacing: { before: 80, after: 100, line: 300, lineRule: "auto" },
children: [
new TextRun({ text: "Teleconsent represents a meaningful step forward in clinical trial recruitment. By embedding the informed consent process into a live telemedicine video session, it overcomes the access and travel barriers of traditional consent while preserving the human interaction that makes in-person consent effective. It offers legally compliant electronic signatures, HIPAA-compliant security, and a full audit trail — while being deployed as a simple browser-based tool requiring no software installation.", size: 20, font: "Calibri", color: "2D2D2D" }),
]
}),
new Paragraph({
spacing: { before: 40, after: 100, line: 300, lineRule: "auto" },
children: [
new TextRun({ text: "Teleconsent is not intended to replace existing consent mechanisms — it is a complement, extending reach to rural, underserved, rare-disease, and geographically dispersed populations, and enabling the standardization of multisite trial consent. Future research will quantify its impact on recruitment outcomes.", size: 20, font: "Calibri", color: "2D2D2D" }),
]
}),
gap(100),
new Paragraph({
alignment: AlignmentType.CENTER,
border: { top: { style: BorderStyle.SINGLE, size: 6, color: TEAL, space: 6 }, bottom: { style: BorderStyle.SINGLE, size: 6, color: TEAL, space: 6 } },
spacing: { before: 80, after: 80 },
children: [
new TextRun({ text: "Welch BM et al. | Teleconsent: A novel approach to obtain informed consent for research | ", bold: true, size: 18, font: "Calibri", color: NAVY }),
new TextRun({ text: "Contemporary Clinical Trials Communications 3 (2016) 74–79", size: 18, font: "Calibri", color: TEAL, italics: true }),
]
}),
]
}
]
});
Packer.toBuffer(doc).then(buffer => {
fs.writeFileSync("/home/daytona/workspace/teleconsent-pptx/Teleconsent_Summary.docx", buffer);
console.log("Done: /home/daytona/workspace/teleconsent-pptx/Teleconsent_Summary.docx");
}).catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/teleconsent-pptx && node build_docx.js 2>&1
~/teleconsent-pptx/build_docx.js
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/teleconsent-pptx/build_docx.js'
~/teleconsent-pptx/build_docx.js
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/teleconsent-pptx/build_docx.js'
cd /home/daytona/workspace/teleconsent-pptx && node build_docx.js 2>&1
python3 /home/daytona/skills/docx/scripts/office/validate.py /home/daytona/workspace/teleconsent-pptx/Teleconsent_Summary.docx 2>&1
python3 -c " from docx import Document doc = Document('/home/daytona/workspace/teleconsent-pptx/Teleconsent_Summary.docx') print(f'Paragraphs: {len(doc.paragraphs)}') print(f'Tables: {len(doc.tables)}') print('File is valid and readable.') "
python3 -c " import zipfile, os path = '/home/daytona/workspace/teleconsent-pptx/Teleconsent_Summary.docx' size = os.path.getsize(path) print(f'File size: {size:,} bytes') with zipfile.ZipFile(path) as z: names = z.namelist() print(f'ZIP entries: {len(names)}') for n in names[:10]: print(' ', n) print('Document structure valid.') "
Teleconsent Summary
Word Document · DOCX
| Section | Contents |
|---|---|
| 1. Background & Problem | Stat table (75%, 90%, 5%, 21%) + bullet-point barriers + limitations of existing methods |
| 2. What is Teleconsent? | Plain-language definition + highlighted info box |
| 3. Key Features | Interactive document, two signature methods (side-by-side table), document integrity, Doxy.me platform |
| 4. Comparison Table | Teleconsent vs Telephone, Mail/Fax, eConsent across 8 criteria |
| 5. Key Advantages | Grouped by participant access, research teams, multisite trials, and online recruitment |
| 6. User Feedback | Focus group methodology + findings in a shaded info box |
| 7. IRB Considerations | Two-column table: IRB concerns vs. Teleconsent's responses |
| 8. Limitations | 5 named limitations with explanations |
| 9. Future Directions | Planned studies and development priorities |
| 10. Conclusion | Summary paragraph + full citation block |
Your presentation is ready! Here's the download link: [Teleconsent_Presentation.pptx](/home/daytona/workspace/teleconsent-pptx/Teleconsent_Presentation.pptx) --- **What's inside - all 20 slides:** | # | Slide Title | |---|---| | 1 | Title slide | | 2 | The Clinical Trial Recruitment Crisis (stat boxes) | | 3 | Barriers to the Informed Consent Process | | 4 | Limitations of Existing Remote Consent Methods | | 5 | What is Teleconsent? | | 6 | How Teleconsent Works - Step by Step | | 7 | Real-Time Interactive Features | | 8 | Electronic Signature: Two Compliant Methods | | 9 | Document Management & Audit Trail | | 10 | Built on the Doxy.me Platform | | 11 | Privacy & Security | | 12 | Initial User Feedback - Focus Groups at MUSC | | 13 | Key Advantages of Teleconsent | | 14 | Hub-and-Spoke Model for Multisite Trials | | 15 | Teleconsent vs Other Remote Consent Approaches (comparison table) | | 16 | Innovative Uses of Teleconsent | | 17 | IRB Considerations (concerns vs. solutions) | | 18 | Limitations | | 19 | Future Directions | | 20 | Conclusion | The deck uses a navy/teal/sky blue palette with a clean professional design - dark title/conclusion slides, lighter content slides, stat boxes, comparison tables, and two-column layouts throughout. make slides in points
~/teleconsent-pptx/build_v2.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Teleconsent – A Novel Approach to Informed Consent";
// ── Palette ────────────────────────────────────────────────────────────────
const C = {
navy: "0D2B45",
teal: "1A7A8A",
sky: "3DBCCC",
white: "FFFFFF",
offwhite:"F0F6F8",
silver: "A8C5CC",
lightbg: "E8F5F8",
gray: "4A5568",
yellow: "F4D03F",
green: "27AE60",
red: "E74C3C",
};
// ── Shared helpers ─────────────────────────────────────────────────────────
const bg = (s, color) =>
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:10, h:5.625, fill:{color} });
const headerBand = (s, color = C.teal) =>
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:10, h:1.05, fill:{color} });
const leftAccent = (s, color = C.sky) =>
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:0.10, h:5.625, fill:{color} });
const slideTitle = (s, text, color = C.white) =>
s.addText(text, { x:0.35, y:0.1, w:9.3, h:0.85, fontSize:23, bold:true,
color, fontFace:"Calibri", valign:"middle" });
// Bullet list helper — short, punchy points
function bullets(s, items, opts = {}) {
const {
x = 0.45, y = 1.15, w = 9.1, h = 4.2,
fontSize = 18, color = C.navy, indent = 0.3,
} = opts;
const arr = items.map((item, i) => ({
text: (typeof item === "object") ? item.text : item,
options: {
bullet: { type: "bullet", indent: indent * 914400 / 100 },
breakLine: i < items.length - 1,
color: (typeof item === "object" && item.color) ? item.color : color,
fontSize,
fontFace: "Calibri",
bold: (typeof item === "object" && item.bold) ? true : false,
paraSpaceAfter: 8,
paraSpaceBefore: 2,
},
}));
s.addText(arr, { x, y, w, h, valign:"top" });
}
// Two-column bullets
function twoCols(s, left, right, opts = {}) {
const { y = 1.15, fontSize = 17 } = opts;
s.addShape(pres.ShapeType.rect, { x:5.08, y:1.1, w:0.03, h:4.3, fill:{color:C.silver} });
bullets(s, left, { x:0.30, y, w:4.6, h:4.3, fontSize });
bullets(s, right, { x:5.25, y, w:4.45, h:4.3, fontSize });
}
// Stat box
function statBox(s, num, label, x, y, w=2.75, h=1.95) {
s.addShape(pres.ShapeType.rect, { x, y, w, h, fill:{color:C.navy}, line:{color:C.sky, pt:2} });
s.addText(num, { x, y:y+0.12, w, h:1.0, fontSize:40, bold:true, color:C.sky, align:"center", fontFace:"Calibri" });
s.addText(label, { x:x+0.1, y:y+1.05, w:w-0.2, h:0.8, fontSize:12.5, color:C.white, align:"center", fontFace:"Calibri", wrap:true });
}
// Icon card (small colored card with icon + text)
function iconCard(s, icon, lines, x, y, w=2.8, h=2.4, fill=C.navy) {
s.addShape(pres.ShapeType.rect, { x, y, w, h, fill:{color:fill}, line:{color:C.sky, pt:1.5} });
s.addText(icon, { x, y:y+0.1, w, h:0.7, fontSize:28, align:"center" });
const arr = lines.map((l,i) => ({
text: l,
options: { bullet:{type:"bullet"}, breakLine: i < lines.length-1,
color:C.white, fontSize:13, fontFace:"Calibri", paraSpaceAfter:4 }
}));
s.addText(arr, { x:x+0.1, y:y+0.82, w:w-0.2, h:h-0.95, valign:"top" });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 1 – Title
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.navy);
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:10, h:0.07, fill:{color:C.sky} });
s.addShape(pres.ShapeType.rect, { x:0, y:5.46, w:10, h:0.165, fill:{color:C.teal} });
// decorative circle
s.addShape(pres.ShapeType.ellipse, { x:7.1, y:0.55, w:3.3, h:3.3, fill:{color:C.teal} });
s.addShape(pres.ShapeType.ellipse, { x:7.45, y:0.9, w:2.6, h:2.6, fill:{color:C.navy} });
s.addText("📹", { x:7.6, y:1.4, w:2.3, h:1.5, fontSize:55, align:"center" });
s.addText("TELECONSENT", { x:0.5, y:1.1, w:6.8, h:0.65, fontSize:13, bold:true,
color:C.sky, charSpacing:7, fontFace:"Calibri" });
s.addText("A Novel Approach to\nObtaining Informed Consent\nfor Research", {
x:0.5, y:1.65, w:6.6, h:2.2, fontSize:30, bold:true, color:C.white,
fontFace:"Calibri", lineSpacingMultiple:1.25 });
s.addText("Welch et al. | Contemporary Clinical Trials Communications | 2016", {
x:0.5, y:4.9, w:9, h:0.4, fontSize:11, color:C.silver, italic:true, fontFace:"Calibri" });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 2 – Recruitment Crisis
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "The Clinical Trial Recruitment Crisis");
statBox(s, "75%", "of trials FAIL to reach recruitment goals", 0.35, 1.2);
statBox(s, "90%", "fail to enroll within the allotted time", 3.62, 1.2);
statBox(s, "5%", "of invited participants complete the trial", 6.9, 1.2);
s.addShape(pres.ShapeType.rect, { x:0.35, y:3.35, w:9.3, h:0.03, fill:{color:C.silver} });
bullets(s, [
{ text: "Failure → costly time extensions", bold:true },
"Underpowered or unpublished results",
"Early trial termination",
"Delayed translation of life-saving interventions",
], { x:0.5, y:3.45, w:9.0, h:1.85, fontSize:16 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 3 – Barriers to Informed Consent
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "Barriers to the Informed Consent Process");
leftAccent(s);
bullets(s, [
"Patient travel burden to investigator site",
"Scheduling difficulties between staff and participants",
"Workflow disruption at high-volume clinical sites",
"Difficulty understanding complex consent documents",
"Geographic exclusion — trials concentrated near investigators",
"Training remote site staff is costly and error-prone",
"Incomplete or erroneous consents cause delays",
"Existing remote options (phone, fax, mail) lack interactivity",
], { fontSize:17 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 4 – Limitations of Existing Solutions
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Why Existing Methods Fall Short");
const cols = [
{ icon:"📞", title:"Telephone", pts:[
"No written documentation",
"No participant signature",
"Cannot verify identity",
"Audio only — no visual cues",
]},
{ icon:"📠", title:"Mail / Fax", pts:[
"Logistical burden on participant",
"Delays in document return",
"Identity hard to verify",
"Errors and missing pages common",
]},
{ icon:"💻", title:"eConsent", pts:[
"Improves readability & management",
"No live human interaction",
"Cannot detect nonverbal confusion",
"Lacks remote access capability",
]},
];
cols.forEach(({icon, title, pts}, i) => {
const x = 0.3 + i * 3.22;
s.addShape(pres.ShapeType.rect, { x, y:1.15, w:3.05, h:4.2, fill:{color:C.navy}, line:{color:C.sky, pt:1.5} });
s.addText(`${icon} ${title}`, { x, y:1.15, w:3.05, h:0.65, fontSize:15, bold:true,
color:C.sky, align:"center", fontFace:"Calibri", valign:"middle" });
s.addShape(pres.ShapeType.rect, { x:x+0.1, y:1.78, w:2.85, h:0.03, fill:{color:C.teal} });
const arr = pts.map((p,j) => ({
text:p, options:{ bullet:{type:"bullet"}, breakLine: j<pts.length-1,
color:C.white, fontSize:14, fontFace:"Calibri", paraSpaceAfter:8 }
}));
s.addText(arr, { x:x+0.12, y:1.88, w:2.82, h:3.3, valign:"top" });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 5 – What is Teleconsent?
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.navy);
s.addShape(pres.ShapeType.rect, { x:0, y:5.46, w:10, h:0.165, fill:{color:C.sky} });
s.addText("WHAT IS TELECONSENT?", { x:0.5, y:0.25, w:9, h:0.6, fontSize:13, bold:true,
color:C.sky, charSpacing:5, fontFace:"Calibri" });
// Core definition box
s.addShape(pres.ShapeType.rect, { x:0.4, y:0.85, w:9.2, h:1.4, fill:{color:C.teal}, line:{color:C.sky, pt:1} });
bullets(s, [
"Consent process embedded inside a live telemedicine video call",
"Researcher remotely guides participant through consent form in real time",
"Both parties view, edit, and sign the document together — on screen",
], { x:0.55, y:0.9, w:8.9, h:1.3, fontSize:16, color:C.white });
// Three pillars
const pillars = [
[C.teal, "🎥", "VIDEO CALL", ["Live face-to-face video", "No travel required", "HIPAA-compliant platform"]],
["1A5276", "📄", "SHARED DOCUMENT", ["Interactive HTML5 consent form", "Real-time co-editing", "Scroll & highlight together"]],
[C.teal, "✍️", "E-SIGNATURE", ["Photo or free-draw signature", "Legally compliant (FDA 21 CFR)", "PDF + audit trail generated"]],
];
pillars.forEach(([fill, icon, head, pts], i) => {
const x = 0.38 + i * 3.15;
s.addShape(pres.ShapeType.rect, { x, y:2.5, w:3.0, h:2.9, fill:{color:fill} });
s.addText(`${icon} ${head}`, { x, y:2.5, w:3.0, h:0.65, fontSize:13, bold:true,
color:C.sky, align:"center", fontFace:"Calibri", valign:"middle" });
s.addShape(pres.ShapeType.rect, { x:x+0.05, y:3.13, w:2.9, h:0.03, fill:{color:C.sky} });
const arr = pts.map((p,j) => ({
text:p, options:{ bullet:{type:"bullet"}, breakLine: j<pts.length-1,
color:C.white, fontSize:13, fontFace:"Calibri", paraSpaceAfter:6 }
}));
s.addText(arr, { x:x+0.1, y:3.2, w:2.8, h:2.1, valign:"top" });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 6 – Step by Step
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "How Teleconsent Works — Step by Step");
const steps = [
"Researcher shares personalized Doxy.me URL with participant",
"Participant clicks link — no login, no software install needed",
"Participant enters waiting room; researcher starts video call",
"Researcher opens consent form — shared live on both screens",
"Both scroll, highlight, and complete form fields together",
"Participant flags unclear text; researcher explains in real time",
"Researcher finalizes document → signed PDF + audit trail saved",
];
steps.forEach((text, i) => {
const y = 1.15 + i * 0.615;
s.addShape(pres.ShapeType.ellipse, { x:0.28, y:y+0.05, w:0.42, h:0.42, fill:{color:C.teal} });
s.addText(String(i+1), { x:0.28, y:y+0.05, w:0.42, h:0.42, fontSize:14, bold:true,
color:C.white, align:"center", valign:"middle", fontFace:"Calibri" });
if (i < steps.length - 1) {
s.addShape(pres.ShapeType.rect, { x:0.465, y:y+0.47, w:0.05, h:0.2, fill:{color:C.silver} });
}
s.addText(text, { x:0.85, y, w:8.85, h:0.56, fontSize:16, color:C.navy,
fontFace:"Calibri", valign:"middle" });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 7 – Real-Time Interactive Features
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Real-Time Interactive Features");
leftAccent(s);
s.addText("Researcher Can:", { x:0.28, y:1.1, w:4.5, h:0.4, fontSize:14, bold:true,
color:C.teal, fontFace:"Calibri" });
s.addText("Participant Can:", { x:5.22, y:1.1, w:4.5, h:0.4, fontSize:14, bold:true,
color:C.teal, fontFace:"Calibri" });
s.addShape(pres.ShapeType.rect, { x:5.08, y:1.08, w:0.03, h:4.35, fill:{color:C.silver} });
bullets(s, [
"Scroll document — syncs to participant's screen",
"Highlight text to direct attention",
"See participant's cursor in real time",
"Fill in form fields on participant's behalf",
"Mute/enable per-field edit access",
"Use text chat throughout the call",
], { x:0.28, y:1.52, w:4.6, h:3.9, fontSize:16 });
bullets(s, [
"Highlight confusing text for researcher",
"Edit designated form fields",
"See researcher's cursor in real time",
"Ask questions via text or voice",
"Sign using webcam photo or free-draw",
"Print or download final PDF",
], { x:5.22, y:1.52, w:4.5, h:3.9, fontSize:16 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 8 – Electronic Signatures
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "Electronic Signature — Two Compliant Methods");
// Photo sig
s.addShape(pres.ShapeType.rect, { x:0.35, y:1.15, w:4.35, h:4.2, fill:{color:C.navy}, line:{color:C.sky, pt:2} });
s.addText("📷 Photo Signature", { x:0.35, y:1.15, w:4.35, h:0.65, fontSize:16, bold:true,
color:C.sky, align:"center", fontFace:"Calibri", valign:"middle" });
s.addShape(pres.ShapeType.rect, { x:0.5, y:1.78, w:4.05, h:0.03, fill:{color:C.teal} });
bullets(s, [
"User types name in signature field",
"Webcam snapshot taken at moment of signing",
"IP address, date & time recorded",
"Verifies identity without account login",
"Compliant with FDA 21 CFR Part 11",
"Reviewed and approved by legal experts",
], { x:0.5, y:1.88, w:4.05, h:3.35, fontSize:15, color:C.white });
// Free draw
s.addShape(pres.ShapeType.rect, { x:5.3, y:1.15, w:4.35, h:4.2, fill:{color:C.navy}, line:{color:C.sky, pt:2} });
s.addText("✏️ Free-Draw Signature", { x:5.3, y:1.15, w:4.35, h:0.65, fontSize:16, bold:true,
color:C.sky, align:"center", fontFace:"Calibri", valign:"middle" });
s.addShape(pres.ShapeType.rect, { x:5.45, y:1.78, w:4.05, h:0.03, fill:{color:C.teal} });
bullets(s, [
"Draw signature with mouse or finger",
"Embedded signature box in consent form",
"Ideal for tablets and touchscreen devices",
"Works on mobile devices",
"Compliant with FDA 21 CFR Part 11",
"Also reviewed and approved by legal experts",
], { x:5.45, y:1.88, w:4.05, h:3.35, fontSize:15, color:C.white });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 9 – Document Management & Audit Trail
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Document Management & Audit Trail");
leftAccent(s);
s.addText("Document Integrity", { x:0.28, y:1.1, w:4.5, h:0.4, fontSize:14, bold:true,
color:C.teal, fontFace:"Calibri" });
s.addText("Audit & Metadata", { x:5.22, y:1.1, w:4.5, h:0.4, fontSize:14, bold:true,
color:C.teal, fontFace:"Calibri" });
s.addShape(pres.ShapeType.rect, { x:5.08, y:1.08, w:0.03, h:4.35, fill:{color:C.silver} });
bullets(s, [
"HTML5 format — supports text, images, audio, video",
"Content locked after IRB approval",
"Only form fields are editable",
"Hash value generated per document",
"Hash detects any tampering",
"Changes require upload of a new document",
], { x:0.28, y:1.52, w:4.6, h:3.9, fontSize:16 });
bullets(s, [
"PDF generated on finalization",
"Audit trail: field, user, role, timestamp, IP",
"PDF saved locally — never on servers",
"Metadata: study title, PI, IRB number, expiry",
"Personal / Enterprise / Global template tiers",
"Template manager for version control",
], { x:5.22, y:1.52, w:4.5, h:3.9, fontSize:16 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 10 – Doxy.me Platform
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "Built on the Doxy.me Telemedicine Platform");
s.addText("Platform Features", { x:0.28, y:1.1, w:4.5, h:0.4, fontSize:14, bold:true,
color:C.navy, fontFace:"Calibri" });
s.addText("HIPAA & Security", { x:5.22, y:1.1, w:4.5, h:0.4, fontSize:14, bold:true,
color:C.navy, fontFace:"Calibri" });
s.addShape(pres.ShapeType.rect, { x:5.08, y:1.08, w:0.03, h:4.35, fill:{color:C.silver} });
bullets(s, [
"Free web-based telemedicine platform",
"WebRTC peer-to-peer audio/video",
"Works natively in Chrome & Firefox",
"No plugins or downloads required",
"Mobile apps available (iOS & Android)",
"No participant account or login needed",
"Enterprise: white-label branding available",
], { x:0.28, y:1.52, w:4.6, h:3.9, fontSize:16 });
bullets(s, [
"All data encrypted (WebRTC)",
"No patient information stored",
"Audit trail of all sessions",
"Business Associate Agreement (BAA) signed",
"Fully HIPAA-compliant",
"Waiting room: customizable with text/video",
"Teleconsent built as an extension on top",
], { x:5.22, y:1.52, w:4.5, h:3.9, fontSize:16 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 11 – Privacy & Security
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.navy);
s.addShape(pres.ShapeType.rect, { x:0, y:5.46, w:10, h:0.165, fill:{color:C.sky} });
s.addText("🔒 Privacy & Security", { x:0.5, y:0.2, w:9, h:0.75, fontSize:26, bold:true,
color:C.white, fontFace:"Calibri" });
const items = [
["WebRTC Encryption", C.sky, [
"All data transmitted peer-to-peer",
"Same encryption as audio/video stream",
"Not routed through central servers",
]],
["No Server Storage", C.sky, [
"Consent data lives only in users' browsers",
"Disappears when window is closed",
"Researcher saves PDF locally",
]],
["HIPAA Compliance", C.sky, [
"BAA signed with all users",
"No patient info retained on platform",
"Session audit trail maintained",
]],
["Document Hash", C.sky, [
"Cryptographic hash per consent form",
"Verifies no post-approval changes",
"Maintains consent integrity for IRB",
]],
];
items.forEach(([title, col, pts], i) => {
const x = 0.3 + i * 2.38;
s.addShape(pres.ShapeType.rect, { x, y:1.1, w:2.2, h:4.3, fill:{color:"0A2035"}, line:{color:col, pt:1.5} });
s.addText(title, { x, y:1.1, w:2.2, h:0.62, fontSize:13, bold:true, color:col,
align:"center", fontFace:"Calibri", valign:"middle" });
s.addShape(pres.ShapeType.rect, { x:x+0.07, y:1.7, w:2.06, h:0.03, fill:{color:col} });
const arr = pts.map((p,j) => ({
text:p, options:{ bullet:{type:"bullet"}, breakLine: j<pts.length-1,
color:C.white, fontSize:13, fontFace:"Calibri", paraSpaceAfter:8 }
}));
s.addText(arr, { x:x+0.1, y:1.8, w:2.0, h:3.4, valign:"top" });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 12 – User Feedback
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "Initial User Feedback — Focus Groups at MUSC");
s.addText("Methodology", { x:0.28, y:1.1, w:3.3, h:0.4, fontSize:14, bold:true,
color:C.navy, fontFace:"Calibri" });
s.addText("Key Findings", { x:4.1, y:1.1, w:5.6, h:0.4, fontSize:14, bold:true,
color:C.navy, fontFace:"Calibri" });
s.addShape(pres.ShapeType.rect, { x:3.9, y:1.08, w:0.03, h:4.35, fill:{color:C.silver} });
bullets(s, [
"2 focus groups — MUSC",
"OB/GYN + SCTR departments",
"8–10 participants per group",
"~60 minutes each session",
"Live demo + structured interview",
"Dual-reviewer analysis",
], { x:0.28, y:1.52, w:3.5, h:3.9, fontSize:15 });
bullets(s, [
{ text:"\"Teleconsent is a time saver\"", bold:true, color:C.teal },
"Remote consenting & re-consenting — major benefit",
"Audit trails praised for regulatory compliance",
"Photo signature valued for verification",
"Minimises participant 'no-shows'",
"Barriers: tech skills, connectivity, in-person preference",
{ text:"Benefits far outweigh barriers — overall positive", bold:true },
], { x:4.1, y:1.52, w:5.6, h:3.9, fontSize:15 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 13 – Advantages
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Key Advantages of Teleconsent");
leftAccent(s);
// Four themed clusters
const clusters = [
{ label:"Access & Inclusion", col:C.teal, pts:[
"Eliminates participant travel burden",
"Reaches rural & underserved populations",
"Enables nationwide / worldwide recruitment",
"Critical for rare disease research",
]},
{ label:"Interaction Quality", col:"1A5276", pts:[
"Researcher observes nonverbal cues",
"Real-time clarification of confusion",
"Person-to-person engagement maintained",
"Equivalent to in-person interaction",
]},
{ label:"Operational Efficiency", col:C.teal, pts:[
"Reduces scheduling burden",
"Minimises no-shows",
"Supports remote re-consenting",
"Standardises multisite consent",
]},
{ label:"Online Recruitment", col:"1A5276", pts:[
"Pairs with ResearchMatch / social media",
"Participant consents at peak interest",
"Removes gap between interest & enrolment",
"Suitable for direct-to-participant trials",
]},
];
clusters.forEach(({label, col, pts}, i) => {
const x = 0.28 + (i % 2) * 4.88;
const y = 1.15 + Math.floor(i / 2) * 2.2;
s.addShape(pres.ShapeType.rect, { x, y, w:4.6, h:2.05, fill:{color:"F7FBFC"}, line:{color:col, pt:2} });
s.addShape(pres.ShapeType.rect, { x, y, w:4.6, h:0.45, fill:{color:col} });
s.addText(label, { x, y, w:4.6, h:0.45, fontSize:13, bold:true, color:C.white,
align:"center", fontFace:"Calibri", valign:"middle" });
const arr = pts.map((p,j) => ({
text:p, options:{ bullet:{type:"bullet"}, breakLine: j<pts.length-1,
color:C.navy, fontSize:13.5, fontFace:"Calibri", paraSpaceAfter:4 }
}));
s.addText(arr, { x:x+0.1, y:y+0.5, w:4.4, h:1.5, valign:"top" });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 14 – Multisite Hub-and-Spoke
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "Hub-and-Spoke Model for Multisite Trials");
s.addText("Traditional Approach", { x:0.28, y:1.1, w:4.5, h:0.4, fontSize:14, bold:true,
color:C.red, fontFace:"Calibri" });
s.addText("Teleconsent Approach", { x:5.22, y:1.1, w:4.5, h:0.4, fontSize:14, bold:true,
color:C.green, fontFace:"Calibri" });
s.addShape(pres.ShapeType.rect, { x:5.08, y:1.08, w:0.03, h:4.35, fill:{color:C.silver} });
bullets(s, [
"Train staff at every remote site",
"Staff need full regulatory compliance training",
"Workflow disruption at each clinic",
"Risk of incomplete / erroneous consents",
"Timely return of documents is challenging",
"Difficult to standardize across sites",
], { x:0.28, y:1.52, w:4.6, h:3.9, fontSize:16 });
bullets(s, [
{ text:"Single trained consenter at central hub", bold:true },
"Remotely consents participants at all sites",
"No per-site staff training required",
"Sites just need internet access",
"Standardized process across all locations",
"Scales efficiently as trial grows",
], { x:5.22, y:1.52, w:4.5, h:3.9, fontSize:16 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 15 – Comparison Table
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Teleconsent vs Other Remote Consent Methods");
const rows = [
["Feature", "Phone", "Mail/Fax", "eConsent", "Teleconsent"],
["Written document", "✗", "✓", "✓", "✓"],
["Participant signature", "✗", "✓", "✓", "✓"],
["Identity verification", "✗", "✗", "Partial", "✓"],
["Live interaction", "Audio only","✗", "✗", "✓ Video"],
["Nonverbal cue detection","✗", "✗", "✗", "✓"],
["Real-time guidance", "✗", "✗", "✗", "✓"],
["No travel required", "✓", "✓", "✓", "✓"],
["HIPAA compliant", "Partial", "Partial", "✓", "✓"],
];
const cw = [2.5, 1.5, 1.5, 1.5, 1.65];
const cx = [0.25, 2.8, 4.3, 5.8, 7.3];
rows.forEach((row, r) => {
row.forEach((cell, c) => {
const isH = r === 0;
const isTele = c === 4;
const isLbl = c === 0;
const fill = isH ? C.navy : (isTele ? "D6F0F5" : (r % 2 === 0 ? C.offwhite : "E4F3F5"));
const fc = isH ? C.white : (isTele ? C.teal : (isLbl ? C.navy : C.gray));
s.addShape(pres.ShapeType.rect, { x:cx[c], y:1.12 + r*0.495, w:cw[c], h:0.495,
fill:{color:fill}, line:{color:C.silver, pt:0.5} });
s.addText(cell, { x:cx[c]+0.05, y:1.12 + r*0.495, w:cw[c]-0.1, h:0.495,
fontSize: isH ? 12 : 12.5,
bold: isH || isLbl || isTele,
color:fc, fontFace:"Calibri", valign:"middle", align: isLbl ? "left" : "center" });
});
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 16 – Innovative Uses
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.teal);
slideTitle(s, "Innovative Uses of Teleconsent");
leftAccent(s);
twoCols(s,
[
{ text:"Three-Way Consent Calls", bold:true, color:C.teal },
"Include Legally Authorized Representatives (e.g. parent, spouse)",
"All parties join remotely — no shared location needed",
"Useful for studies requiring co-signatures",
"",
{ text:"Research Navigator Support", bold:true, color:C.teal },
"Navigator joins call to support participant",
"Proven to enhance minority trial participation",
],
[
{ text:"Online Recruitment Integration", bold:true, color:C.teal },
"Pair with ResearchMatch or Facebook campaigns",
"Participant consents at moment of peak interest",
"Eliminates drop-off between interest and enrolment",
"",
{ text:"Rare Disease Research", bold:true, color:C.teal },
"Geographic spread of patients makes in-person impossible",
"Teleconsent enables global participant access",
],
{ fontSize:15.5 }
);
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 17 – IRB Considerations
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Institutional Review Board (IRB) Considerations");
s.addText("⚠ IRB Concerns", { x:0.28, y:1.1, w:4.5, h:0.4, fontSize:14, bold:true,
color:"C0392B", fontFace:"Calibri" });
s.addText("✓ Teleconsent's Response", { x:5.22, y:1.1, w:4.5, h:0.4, fontSize:14, bold:true,
color:C.green, fontFace:"Calibri" });
s.addShape(pres.ShapeType.rect, { x:5.08, y:1.08, w:0.03, h:4.35, fill:{color:C.silver} });
bullets(s, [
"Participant privacy & confidentiality",
"Consent document integrity",
"Ability to remove/update templates",
"Technology access for all participants",
"Accessibility for special populations",
" (elderly, adolescents, minorities)",
], { x:0.28, y:1.52, w:4.6, h:3.9, fontSize:16 });
bullets(s, [
"WebRTC encryption + no server storage",
"Hash verification + locked content",
"IRB can deactivate any template instantly",
"Pilot sessions identify access issues early",
"Family/friend devices or public libraries as alternatives",
"Pilot testing with target population at MUSC proven effective",
], { x:5.22, y:1.52, w:4.5, h:3.9, fontSize:16 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 18 – Limitations
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.offwhite);
headerBand(s, C.navy);
slideTitle(s, "Limitations of Teleconsent");
const lims = [
["💻", "Technology Access",
["Needs computer + reliable internet", "67% have home broadband; 13% smartphone only", "Digital divide smaller than often assumed — 62% low-SES have access"]],
["📱", "Mobile Compatibility",
["Limited tablet/smartphone support at publication", "Larger screens better for reading consent text", "Improvement ongoing"]],
["😟", "Participant Comfort",
["Not everyone comfortable on video call", "Teleconsent is a complement — not a replacement", "Traditional consent always remains an option"]],
["🏥", "Institutional Overhead",
["Requires IT support & staff training", "Organizational approval needed", "Adds complexity above paper-based consent"]],
["⚙️", "Workflow Gaps",
["No researcher-side IRB e-submission tool", "No automated capture of consent choices as structured data", "E.g. biospecimen permissions not auto-captured"]],
];
lims.forEach(([icon, title, pts], i) => {
const col = i % 2 === 0 ? C.teal : "1A5276";
const x = 0.28 + (i % 3) * 3.22;
const y = i < 3 ? 1.15 : 3.4;
const w = i < 3 ? 3.05 : (i === 3 ? 3.05 : 3.3);
s.addShape(pres.ShapeType.rect, { x, y, w, h:2.0, fill:{color:"F7FBFC"}, line:{color:col, pt:1.5} });
s.addShape(pres.ShapeType.rect, { x, y, w, h:0.48, fill:{color:col} });
s.addText(`${icon} ${title}`, { x, y, w, h:0.48, fontSize:12.5, bold:true, color:C.white,
align:"center", fontFace:"Calibri", valign:"middle" });
const arr = pts.map((p,j) => ({
text:p, options:{ bullet:{type:"bullet"}, breakLine: j<pts.length-1,
color:C.navy, fontSize:12, fontFace:"Calibri", paraSpaceAfter:4 }
}));
s.addText(arr, { x:x+0.1, y:y+0.52, w:w-0.2, h:1.42, valign:"top" });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 19 – Future Directions
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.navy);
s.addShape(pres.ShapeType.rect, { x:0, y:5.46, w:10, h:0.165, fill:{color:C.sky} });
s.addText("Future Directions", { x:0.5, y:0.2, w:9, h:0.7, fontSize:26, bold:true,
color:C.white, fontFace:"Calibri" });
const future = [
["📊", "Impact Studies", ["Measure effect on recruitment & accrual rates", "Studies underway at time of publication"]],
["⚖️", "Comparative Research", ["Teleconsent vs traditional consent methods", "Measure participation and dropout rates"]],
["🔗", "eConsent Integration", ["Combine teleconsent video + eConsent management", "Harness benefits of both platforms"]],
["📝", "Workflow Automation", ["Researcher-side IRB e-submission tools", "Auto-capture of consent choices as structured data"]],
["📱", "Mobile Enhancement", ["Improve smartphone & tablet compatibility", "Increase access via mobile-first design"]],
];
future.forEach(([icon, title, pts], i) => {
const y = 1.05 + i * 0.87;
s.addShape(pres.ShapeType.rect, { x:0.35, y:y+0.07, w:2.4, h:0.65, fill:{color:C.teal} });
s.addText(`${icon} ${title}`, { x:0.35, y:y+0.07, w:2.4, h:0.65, fontSize:13, bold:true,
color:C.white, align:"center", fontFace:"Calibri", valign:"middle" });
const arr = pts.map((p,j) => ({
text:p, options:{ bullet:{type:"bullet"}, breakLine: j<pts.length-1,
color:C.white, fontSize:14, fontFace:"Calibri" }
}));
s.addText(arr, { x:2.9, y:y+0.05, w:6.8, h:0.78, valign:"middle" });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 20 – Conclusion
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.navy);
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:10, h:0.07, fill:{color:C.sky} });
s.addShape(pres.ShapeType.rect, { x:0, y:5.46, w:10, h:0.165, fill:{color:C.teal} });
s.addText("Conclusion", { x:0.5, y:0.2, w:9, h:0.7, fontSize:28, bold:true,
color:C.white, fontFace:"Calibri" });
bullets(s, [
{ text:"Teleconsent embeds consent into a live telemedicine video call", bold:true },
"Overcomes travel, scheduling, and geographic access barriers",
"Preserves real-time human interaction — unlike eConsent alone",
"Two legally compliant e-signature methods (photo + free-draw)",
"HIPAA-compliant: WebRTC encryption, no server storage, full audit trail",
{ text:"Particularly valuable for: rural, underserved, rare disease & multisite trials", bold:true },
"Complements — does not replace — traditional in-person consent",
"Ongoing studies will quantify impact on recruitment and accrual",
], { y:1.05, h:4.25, fontSize:17, color:C.white });
s.addText("Welch BM et al. | Contemp Clin Trials Commun 3 (2016) 74–79", {
x:0.5, y:5.18, w:9, h:0.3, fontSize:10, color:C.silver, italic:true, fontFace:"Calibri" });
}
// ─── Write ────────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/teleconsent-pptx/Teleconsent_Points.pptx" })
.then(() => console.log("Done: /home/daytona/workspace/teleconsent-pptx/Teleconsent_Points.pptx"))
.catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/teleconsent-pptx && node build_v2.js 2>&1
Teleconsent Points
Presentation · PPTX