Make poster presentations about hd adequacy and depending on factors affect and calculation, how to improve, so on which I missed to mention.
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or missing"
mkdir -p /home/daytona/workspace/hd-adequacy-poster
~/hd-adequacy-poster/build.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE"; // 13.3" x 7.5"
pres.title = "Hemodialysis Adequacy";
// ─── COLOR PALETTE ───────────────────────────────────────────
const C = {
navy: "0B1F4B", // dominant background
teal: "0D7377", // section headers & accent bars
cyan: "14A8B5", // highlights / icons
gold: "F0A500", // key numbers / emphasis
white: "FFFFFF",
offwhite: "E8F4F8",
lightbg: "112244", // slide body bg
muted: "A8C4D0", // sub-text
red: "E05252",
green: "3DBE7A",
};
// ─── HELPERS ─────────────────────────────────────────────────
function addBG(slide, color) {
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: "100%", h: "100%",
fill: { color: color || C.navy },
line: { type: "none" },
});
}
function accentBar(slide, x, y, w, h, color) {
slide.addShape(pres.ShapeType.rect, {
x, y, w, h,
fill: { color: color || C.teal },
line: { type: "none" },
});
}
function sectionTitle(slide, text, x, y, w, color) {
accentBar(slide, x, y, w, 0.05, color || C.gold);
slide.addText(text.toUpperCase(), {
x, y: y + 0.07, w, h: 0.38,
fontSize: 13, bold: true, color: C.gold,
fontFace: "Calibri", margin: 0,
});
}
function card(slide, x, y, w, h, fillColor) {
slide.addShape(pres.ShapeType.roundRect, {
x, y, w, h,
fill: { color: fillColor || C.lightbg },
line: { color: C.teal, pt: 1.2 },
rectRadius: 0.08,
});
}
function bulletBlock(slide, items, x, y, w, h, opts = {}) {
const rows = items.map((t, i) => ({
text: t,
options: { bullet: { type: "bullet", indent: 12 }, breakLine: i < items.length - 1, fontSize: opts.fontSize || 10.5, color: opts.color || C.white, fontFace: "Calibri" },
}));
slide.addText(rows, { x, y, w, h, valign: "top", margin: 6 });
}
// ════════════════════════════════════════════════════════════════
// SLIDE 1 — TITLE / OVERVIEW
// ════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBG(s, C.navy);
// Decorative teal strip left
accentBar(s, 0, 0, 0.18, 7.5, C.teal);
// Gold accent right
accentBar(s, 13.12, 0, 0.18, 7.5, C.gold);
// Main title
s.addText("HEMODIALYSIS ADEQUACY", {
x: 0.4, y: 1.1, w: 12.5, h: 1.2,
fontSize: 44, bold: true, color: C.white,
fontFace: "Calibri", align: "center", charSpacing: 4,
});
// Subtitle bar
accentBar(s, 2.5, 2.5, 8.3, 0.06, C.gold);
s.addText("Measurement · Determinants · Targets · Strategies to Improve", {
x: 0.4, y: 2.6, w: 12.5, h: 0.55,
fontSize: 18, color: C.muted, fontFace: "Calibri", align: "center", italic: true,
});
// Four overview boxes
const boxes = [
{ icon: "📐", label: "Kt/V & URR", sub: "Gold-standard metrics" },
{ icon: "⚖️", label: "Influencing Factors", sub: "Dialyzer · Time · Access · RKF" },
{ icon: "🎯", label: "Target Values", sub: "spKt/V ≥ 1.4 | URR > 65%" },
{ icon: "🔧", label: "How to Improve", sub: "Practical clinical strategies" },
];
boxes.forEach((b, i) => {
const bx = 0.5 + i * 3.1;
card(s, bx, 3.4, 2.9, 2.5, C.lightbg);
s.addText(b.icon, { x: bx, y: 3.55, w: 2.9, h: 0.6, align: "center", fontSize: 26 });
s.addText(b.label, { x: bx, y: 4.2, w: 2.9, h: 0.45, align: "center", fontSize: 14, bold: true, color: C.cyan, fontFace: "Calibri" });
s.addText(b.sub, { x: bx, y: 4.65, w: 2.9, h: 0.5, align: "center", fontSize: 10, color: C.muted, fontFace: "Calibri", italic: true });
});
// Source note
s.addText("Source: Brenner & Rector's The Kidney | KDOQI Clinical Practice Guidelines", {
x: 0.4, y: 7.1, w: 12.5, h: 0.3,
fontSize: 8.5, color: C.muted, fontFace: "Calibri", align: "center", italic: true,
});
}
// ════════════════════════════════════════════════════════════════
// SLIDE 2 — WHAT IS HD ADEQUACY & WHY IT MATTERS
// ════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBG(s, C.navy);
accentBar(s, 0, 0, 13.3, 0.9, C.teal);
s.addText("WHAT IS HEMODIALYSIS ADEQUACY?", {
x: 0.3, y: 0.1, w: 12.7, h: 0.7,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle",
});
// Definition card
card(s, 0.3, 1.05, 12.7, 1.35, "0D1E40");
s.addText([
{ text: "Definition: ", options: { bold: true, color: C.gold } },
{ text: "HD adequacy refers to the sufficiency of solute and water removal during dialysis — primarily quantified by the fractional clearance of urea (Kt/V) — to maintain patient health and reduce uremic morbidity and mortality.", options: { color: C.white } },
], { x: 0.5, y: 1.12, w: 12.3, h: 1.1, fontSize: 12, fontFace: "Calibri", valign: "middle" });
// Two columns
// Left: Historical context
card(s, 0.3, 2.6, 6.1, 3.8, C.lightbg);
sectionTitle(s, "Historical Milestones", 0.45, 2.65, 5.8, C.gold);
bulletBlock(s, [
"1973 — Medicare funded ESRD dialysis; adequacy largely ignored",
"1974 — National Cooperative Dialysis Study (NCDS) launched",
"NCDS found strong association between Kt/V and patient outcome",
"Mortality risk rises significantly when spKt/V falls below 1.2",
"Hemo Study (NIH, late 1990s): no added benefit if spKt/V > 1.3 (3×/week)",
"Guidelines now mandate minimum Kt/V standards of care worldwide",
"Failure to achieve target dose is an independent mortality risk factor",
], 0.45, 3.1, 5.8, 3.1, { fontSize: 10.5 });
// Right: Scope
card(s, 6.9, 2.6, 6.1, 3.8, C.lightbg);
sectionTitle(s, "Scope of Adequacy", 7.05, 2.65, 5.8, C.gold);
bulletBlock(s, [
"Primary goal: removal of uremic toxins (urea as surrogate marker)",
"Considers solute removal + fluid balance (ultrafiltration)",
"Separate from: anemia management, nutrition, CVD risk",
"Protein-bound & sequestered toxins are not fully dialyzed",
"High-MW solute flux may affect outcomes beyond urea",
"Residual kidney function (RKF) contributes substantially between sessions",
"Global kidney replacement therapy ≠ dialysis adequacy alone",
], 7.05, 3.1, 5.8, 3.1, { fontSize: 10.5 });
s.addText("Brenner & Rector's The Kidney, 10th ed.", {
x: 0.3, y: 7.15, w: 12.7, h: 0.25, fontSize: 8, color: C.muted, fontFace: "Calibri", italic: true, align: "right",
});
}
// ════════════════════════════════════════════════════════════════
// SLIDE 3 — MEASURING ADEQUACY: Kt/V & URR
// ════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBG(s, C.navy);
accentBar(s, 0, 0, 13.3, 0.9, C.teal);
s.addText("MEASURING HD ADEQUACY: Kt/V & URR", {
x: 0.3, y: 0.1, w: 12.7, h: 0.7,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle",
});
// Kt/V card
card(s, 0.3, 1.0, 8.0, 5.6, C.lightbg);
sectionTitle(s, "Kt/V — The Gold Standard", 0.45, 1.05, 7.7);
s.addText([
{ text: "K", options: { bold: true, color: C.cyan } },
{ text: " = urea clearance (mL/min) ", options: { color: C.white } },
{ text: "t", options: { bold: true, color: C.cyan } },
{ text: " = treatment time (min) ", options: { color: C.white } },
{ text: "V", options: { bold: true, color: C.cyan } },
{ text: " = urea distribution volume (body water, mL)", options: { color: C.white } },
], { x: 0.5, y: 1.52, w: 7.6, h: 0.5, fontSize: 11, fontFace: "Calibri" });
// Formula box
accentBar(s, 0.5, 2.12, 7.6, 0.04, C.teal);
card(s, 0.5, 2.2, 7.6, 0.85, "091830");
s.addText("spKt/V = −ln(R − 0.008×t) + (4 − 3.5R) × UF/W", {
x: 0.6, y: 2.28, w: 7.4, h: 0.6,
fontSize: 13, bold: true, color: C.gold, fontFace: "Courier New", align: "center",
});
s.addText("Daugirdas II Equation (R = post-BUN/pre-BUN, UF = ultrafiltrate volume L, W = post-dialysis weight kg)", {
x: 0.5, y: 3.08, w: 7.6, h: 0.35, fontSize: 9, color: C.muted, fontFace: "Calibri", italic: true,
});
bulletBlock(s, [
"Single-pool Kt/V (spKt/V): simpler, derived from pre/post BUN",
"Double-pool Kt/V: accounts for urea rebound (access recirculation); more accurate",
"Equilibrated Kt/V (eKt/V): corrects for post-dialysis urea rebound",
"Standard Kt/V (stdKt/V): allows comparison across frequencies & modalities",
"Minimum target: spKt/V ≥ 1.4 per treatment (KDOQI 2015); eKt/V ≥ 1.2",
"For women and smaller patients: higher weight-indexed dose recommended",
], 0.45, 3.5, 7.7, 2.85, { fontSize: 10.5 });
// URR card
card(s, 8.7, 1.0, 4.3, 5.6, C.lightbg);
sectionTitle(s, "URR — Urea Reduction Ratio", 8.85, 1.05, 4.0);
card(s, 8.85, 1.52, 4.0, 0.75, "091830");
s.addText("URR = (C₀ − Cf) / C₀ × 100%", {
x: 8.95, y: 1.58, w: 3.8, h: 0.55,
fontSize: 13, bold: true, color: C.gold, fontFace: "Courier New", align: "center",
});
s.addText("C₀ = pre-dialysis BUN Cf = post-dialysis BUN", {
x: 8.85, y: 2.32, w: 4.0, h: 0.3, fontSize: 9, color: C.muted, fontFace: "Calibri", italic: true, align: "center",
});
bulletBlock(s, [
"Target: URR > 65% (minimum)",
"Simple to calculate from blood tests",
"Limitation: less accurate than Kt/V",
"Does NOT account for ultrafiltration",
"URR decreases as dialysis frequency increases — paradox",
"Cannot be summed across multiple sessions",
"Replaced by Kt/V as CMS reporting standard",
"Still used as a quick bedside check",
], 8.85, 2.7, 4.0, 3.7, { fontSize: 10 });
s.addText("Brenner & Rector's The Kidney, 10th ed.", {
x: 0.3, y: 7.15, w: 12.7, h: 0.25, fontSize: 8, color: C.muted, fontFace: "Calibri", italic: true, align: "right",
});
}
// ════════════════════════════════════════════════════════════════
// SLIDE 4 — FACTORS AFFECTING HD ADEQUACY
// ════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBG(s, C.navy);
accentBar(s, 0, 0, 13.3, 0.9, C.teal);
s.addText("FACTORS AFFECTING HD ADEQUACY", {
x: 0.3, y: 0.1, w: 12.7, h: 0.7,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle",
});
const factors = [
{
title: "1. Dialyzer (Artificial Kidney)",
color: C.teal,
items: [
"KoA (mass transfer coefficient × area) — key dialyzer property",
"High-flux vs low-flux membranes (β₂-microglobulin clearance)",
"Membrane surface area (m²): larger = better clearance",
"Dialyzer reuse: efficiency drops with each reuse",
"Fibre clotting: reduces effective surface area",
],
},
{
title: "2. Blood Flow Rate (Qb)",
color: C.cyan,
items: [
"Standard: 300–500 mL/min",
"Higher Qb → increased urea clearance",
"Limited by vascular access adequacy",
"Recirculation reduces effective Qb",
"AV fistula recirculation: 5–10%; graft: higher",
],
},
{
title: "3. Dialysate Flow Rate (Qd)",
color: "5B9BD5",
items: [
"Standard: 500–800 mL/min",
"Increasing Qd from 500→800: ~10% Kt/V gain",
"Counter-current flow maximizes concentration gradient",
"Online hemodiafiltration uses high Qd effectively",
"Cost and machine limitations may restrict Qd",
],
},
{
title: "4. Treatment Time (Td)",
color: C.gold,
items: [
"Most sessions: 3–4.5 hours, 3×/week conventional",
"Longer Td → better solute clearance & BP control",
"Patient shortening of sessions = major adequacy risk",
"Population studies: longer Td associated with better survival",
"Nocturnal or extended HD: superior fluid/solute balance",
],
},
{
title: "5. Vascular Access",
color: C.red,
items: [
"Arteriovenous fistula (AVF): preferred — lowest recirculation",
"AV graft: higher recirculation than AVF",
"Central venous catheter (CVC): highest recirculation",
"Access recirculation directly lowers effective clearance",
"Needle position & reversal affect recirculation significantly",
],
},
{
title: "6. Residual Kidney Function (RKF)",
color: C.green,
items: [
"Continuous clearance between sessions (vs intermittent dialysis)",
"Even small RKF (1–3 mL/min) has major clinical impact",
"RKF contributes to sodium, phosphate, and middle-molecule removal",
"Loss of RKF associated with worse outcomes",
"Nephrotoxic drugs, contrast, volume depletion accelerate RKF loss",
],
},
{
title: "7. Patient-Related Factors",
color: "9B59B6",
items: [
"Body size: larger V (urea distribution) → harder to achieve target",
"Gender: women may need higher weight-normalized dose (Hemo study)",
"Urea generation rate (G) reflects protein intake",
"Urea rebound: post-dialysis rebound overestimates clearance",
"Patient compliance: skipping/shortening sessions → inadequate Kt/V",
],
},
{
title: "8. Prescription & Technical Factors",
color: "E67E22",
items: [
"Incorrect pre/post sample timing → inaccurate Kt/V calculation",
"Slow pump speed at session start or end",
"Air traps and clotted segments reduce effective blood flow",
"Anticoagulation failure causes circuit clotting",
"Dialysate temperature: affects hemodynamics & tolerability",
],
},
];
const cols = [
[0, 1, 2, 3],
[4, 5, 6, 7],
];
const colX = [0.28, 6.82];
const rowY = [1.0, 2.8, 4.6];
const boxW = 6.4;
const boxH = 1.58;
factors.forEach((f, idx) => {
const col = idx < 4 ? 0 : 1;
const row = idx % 4;
const x = colX[col];
const y = rowY[row >= 2 ? row - 2 + (row >= 2 ? 0 : 0) : row] + (row > 1 ? (row - 2) * 1.78 : row * 1.78);
// recompute simply
const bx = colX[col];
const by = 1.0 + (idx % 4) * 1.63;
card(s, bx, by, boxW, 1.55, C.lightbg);
accentBar(s, bx, by, 0.06, 1.55, f.color);
s.addText(f.title, {
x: bx + 0.15, y: by + 0.05, w: boxW - 0.2, h: 0.32,
fontSize: 10.5, bold: true, color: f.color, fontFace: "Calibri",
});
const rows2 = f.items.slice(0, 3).map((t, i) => ({
text: "• " + t,
options: { breakLine: i < 2, fontSize: 9.2, color: C.white, fontFace: "Calibri" },
}));
s.addText(rows2, { x: bx + 0.15, y: by + 0.38, w: boxW - 0.2, h: 1.1, valign: "top", margin: 2 });
});
s.addText("Brenner & Rector's The Kidney, 10th ed.", {
x: 0.3, y: 7.15, w: 12.7, h: 0.25, fontSize: 8, color: C.muted, fontFace: "Calibri", italic: true, align: "right",
});
}
// ════════════════════════════════════════════════════════════════
// SLIDE 5 — CALCULATING Kt/V STEP BY STEP
// ════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBG(s, C.navy);
accentBar(s, 0, 0, 13.3, 0.9, C.teal);
s.addText("CALCULATING Kt/V — STEP-BY-STEP", {
x: 0.3, y: 0.1, w: 12.7, h: 0.7,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle",
});
// Steps flow
const steps = [
{ n: "1", title: "Collect Blood Samples", desc: "Pre-dialysis BUN (C₀): draw before session starts\nPost-dialysis BUN (Cf): draw at session end — slow pump to 50 mL/min for 15 sec, then sample to avoid recirculation artifact" },
{ n: "2", title: "Record Parameters", desc: "Treatment time (t) in minutes\nPost-dialysis weight (W) in kg\nUltrafiltration volume (UF) in litres = pre-weight − post-weight" },
{ n: "3", title: "Calculate R", desc: "R = Cf / C₀\nExample: pre-BUN = 60 mg/dL, post-BUN = 18 mg/dL\nR = 18/60 = 0.30" },
{ n: "4", title: "Apply Daugirdas II Formula", desc: "spKt/V = −ln(R − 0.008 × t) + (4 − 3.5 × R) × UF/W\nExample: t=240 min, UF=2.5 L, W=70 kg\nspKt/V = −ln(0.30 − 0.008×240) + (4 − 3.5×0.30) × 2.5/70" },
{ n: "5", title: "Interpret Result", desc: "spKt/V ≥ 1.4 per session → Adequate\nspKt/V 1.2–1.39 → Borderline — investigate\nspKt/V < 1.2 → Inadequate — intervention required" },
{ n: "6", title: "Calculate eKt/V (if needed)", desc: "eKt/V = spKt/V × (1 − 0.6/t) + 0.03 (Tattersall equation)\nCorrects for post-dialysis urea rebound\nTarget: eKt/V ≥ 1.2" },
];
steps.forEach((st, i) => {
const col = i % 2 === 0 ? 0 : 1;
const row = Math.floor(i / 2);
const bx = col === 0 ? 0.3 : 6.85;
const by = 1.05 + row * 2.1;
card(s, bx, by, 6.25, 1.95, C.lightbg);
// Step circle
s.addShape(pres.ShapeType.ellipse, {
x: bx + 0.12, y: by + 0.55, w: 0.52, h: 0.52,
fill: { color: C.gold }, line: { type: "none" },
});
s.addText(st.n, {
x: bx + 0.12, y: by + 0.56, w: 0.52, h: 0.5,
fontSize: 14, bold: true, color: C.navy, fontFace: "Calibri", align: "center", valign: "middle",
});
s.addText(st.title, {
x: bx + 0.75, y: by + 0.08, w: 5.4, h: 0.38,
fontSize: 12, bold: true, color: C.cyan, fontFace: "Calibri",
});
s.addText(st.desc, {
x: bx + 0.75, y: by + 0.48, w: 5.4, h: 1.38,
fontSize: 9.8, color: C.white, fontFace: "Calibri", valign: "top",
});
});
s.addText("Brenner & Rector's The Kidney, 10th ed. | Daugirdas JT, 1993", {
x: 0.3, y: 7.15, w: 12.7, h: 0.25, fontSize: 8, color: C.muted, fontFace: "Calibri", italic: true, align: "right",
});
}
// ════════════════════════════════════════════════════════════════
// SLIDE 6 — TARGET VALUES & GUIDELINES
// ════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBG(s, C.navy);
accentBar(s, 0, 0, 13.3, 0.9, C.teal);
s.addText("TARGET VALUES & CLINICAL GUIDELINES", {
x: 0.3, y: 0.1, w: 12.7, h: 0.7,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle",
});
// Big target boxes
const targets = [
{ label: "spKt/V", value: "≥ 1.4", sub: "per session (3×/week)", note: "KDOQI 2015 minimum", color: C.green },
{ label: "eKt/V", value: "≥ 1.2", sub: "equilibrated Kt/V", note: "Corrects for rebound", color: C.cyan },
{ label: "URR", value: "> 65%", sub: "urea reduction ratio", note: "CMS monitoring metric", color: C.gold },
{ label: "stdKt/V", value: "≥ 2.0 /wk", sub: "standard Kt/V (weekly)", note: "Across all frequencies", color: "9B59B6" },
];
targets.forEach((t, i) => {
const bx = 0.3 + i * 3.18;
card(s, bx, 1.05, 3.0, 2.5, C.lightbg);
accentBar(s, bx, 1.05, 3.0, 0.08, t.color);
s.addText(t.label, { x: bx, y: 1.18, w: 3.0, h: 0.45, align: "center", fontSize: 14, bold: true, color: t.color, fontFace: "Calibri" });
s.addText(t.value, { x: bx, y: 1.65, w: 3.0, h: 0.8, align: "center", fontSize: 34, bold: true, color: C.white, fontFace: "Calibri" });
s.addText(t.sub, { x: bx, y: 2.48, w: 3.0, h: 0.35, align: "center", fontSize: 10, color: C.muted, fontFace: "Calibri", italic: true });
s.addText(t.note, { x: bx, y: 2.85, w: 3.0, h: 0.35, align: "center", fontSize: 9.5, color: t.color, fontFace: "Calibri", bold: true });
});
// Guideline comparison table
card(s, 0.3, 3.75, 12.7, 3.2, C.lightbg);
sectionTitle(s, "Guideline Comparison", 0.45, 3.8, 12.4);
// Table header
accentBar(s, 0.3, 4.3, 12.7, 0.42, "0D2244");
const hdr = ["Guideline", "Minimum spKt/V", "Target spKt/V", "URR", "Frequency", "Special Notes"];
const colW = [2.5, 2.0, 2.0, 1.5, 2.0, 2.7];
let cx2 = 0.35;
hdr.forEach((h, i) => {
s.addText(h, { x: cx2, y: 4.32, w: colW[i], h: 0.38, fontSize: 10, bold: true, color: C.gold, fontFace: "Calibri", valign: "middle" });
cx2 += colW[i];
});
const rows = [
["KDOQI 2015 (USA)", "1.2", "1.4", "> 65%", "3×/week", "Dose targeting for women"],
["KDIGO 2012", "1.2", "1.4", "> 65%", "3×/week", "Adjust for residual kidney function"],
["ERA-EDTA", "1.2", "1.4", "> 65%", "3×/week", "stdKt/V ≥ 2.0/wk preferred"],
["UK Renal Association", "1.2", "1.4", "> 65%", "3×/week", "High-flux membrane recommended"],
];
rows.forEach((row, ri) => {
const rowBg = ri % 2 === 0 ? "0D1E40" : "091630";
accentBar(s, 0.3, 4.72 + ri * 0.52, 12.7, 0.52, rowBg);
let cx3 = 0.35;
row.forEach((cell, ci) => {
s.addText(cell, { x: cx3, y: 4.74 + ri * 0.52, w: colW[ci], h: 0.48, fontSize: 9.5, color: ci === 0 ? C.cyan : C.white, fontFace: "Calibri", valign: "middle", bold: ci === 0 });
cx3 += colW[ci];
});
});
s.addText("KDOQI = Kidney Disease Outcomes Quality Initiative | KDIGO = Kidney Disease Improving Global Outcomes | ERA-EDTA = European Renal Association", {
x: 0.3, y: 7.15, w: 12.7, h: 0.25, fontSize: 8, color: C.muted, fontFace: "Calibri", italic: true,
});
}
// ════════════════════════════════════════════════════════════════
// SLIDE 7 — HOW TO IMPROVE HD ADEQUACY
// ════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBG(s, C.navy);
accentBar(s, 0, 0, 13.3, 0.9, C.teal);
s.addText("STRATEGIES TO IMPROVE HD ADEQUACY", {
x: 0.3, y: 0.1, w: 12.7, h: 0.7,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle",
});
const strategies = [
{
icon: "🕐", color: C.gold,
title: "Extend Treatment Time",
items: [
"Increase session duration from 3 → 4–4.5 hours",
"Nocturnal HD (6–8 hrs, 3–6×/week): superior adequacy",
"Longer time reduces ultrafiltration rate → fewer cramps",
"Slow extended dialysis (SLED): slower, better tolerated",
],
},
{
icon: "💉", color: C.red,
title: "Optimize Vascular Access",
items: [
"Promote AVF creation; avoid long-term catheter use",
"Correct access stenosis promptly (fistulogram + intervention)",
"Check recirculation regularly with urea step-test",
"Proper needle placement: arterial distal, venous proximal",
"Avoid needle reversal — doubles recirculation",
],
},
{
icon: "⚡", color: C.cyan,
title: "Increase Blood Flow Rate",
items: [
"Target Qb 350–500 mL/min if access allows",
"Verify pump speed matches actual delivered flow",
"Treat access stenosis to achieve target Qb",
"Check for arterial line collapse/kinking",
],
},
{
icon: "💧", color: "5B9BD5",
title: "Increase Dialysate Flow Rate",
items: [
"Increase Qd from 500 → 800 mL/min",
"Use counter-current flow configuration",
"HDF (hemodiafiltration): higher convective clearance",
"Online HDF: convective volumes 20–25 L/session",
],
},
{
icon: "🔬", color: C.green,
title: "Upgrade Dialyzer",
items: [
"Switch to high-flux membrane dialyzer",
"High KoA dialyzers improve urea & middle-molecule clearance",
"Larger surface area (2.0–2.2 m²) for large patients",
"Avoid dialyzer reuse if clearance declines",
],
},
{
icon: "📅", color: "9B59B6",
title: "Increase Dialysis Frequency",
items: [
"5–6×/week short daily HD: improves phosphate & fluid control",
"stdKt/V better reflects cumulative weekly clearance",
"Home HD: enables flexibility in frequency & duration",
"More frequent dialysis preserves residual kidney function",
],
},
{
icon: "🩺", color: "E67E22",
title: "Preserve Residual Kidney Function",
items: [
"Avoid nephrotoxins: NSAIDs, IV contrast, aminoglycosides",
"Maintain euvolemia — prevent volume depletion episodes",
"Control BP: ACE-I/ARB may slow RKF decline",
"Regular 24-hr urine collection to track RKF",
"Include RKF in total weekly Kt/V calculation",
],
},
{
icon: "📋", color: C.muted,
title: "Patient & Prescription Factors",
items: [
"Educate patients: never shorten or skip sessions",
"Address intradialytic symptoms to improve compliance",
"Review prescription monthly: adjust if Kt/V < target",
"Correct sample timing: slow pump method for post-BUN",
"Confirm actual treatment time vs prescribed time",
],
},
];
const colX2 = [0.28, 3.58, 6.88, 10.18];
const rowY2 = [1.0, 3.52];
strategies.forEach((st, i) => {
const col = i % 4;
const row = Math.floor(i / 4);
const bx = colX2[col];
const by = rowY2[row];
card(s, bx, by, 3.1, 2.35, C.lightbg);
accentBar(s, bx, by, 3.1, 0.06, st.color);
s.addText(st.icon + " " + st.title, {
x: bx + 0.1, y: by + 0.1, w: 2.9, h: 0.45,
fontSize: 10.5, bold: true, color: st.color, fontFace: "Calibri",
});
const brows = st.items.map((t, i2) => ({
text: "• " + t,
options: { breakLine: i2 < st.items.length - 1, fontSize: 9, color: C.white, fontFace: "Calibri" },
}));
s.addText(brows, { x: bx + 0.1, y: by + 0.58, w: 2.9, h: 1.68, valign: "top", margin: 2 });
});
s.addText("KDOQI 2015 | Brenner & Rector's The Kidney | HEMO Study", {
x: 0.3, y: 7.15, w: 12.7, h: 0.25, fontSize: 8, color: C.muted, fontFace: "Calibri", italic: true, align: "right",
});
}
// ════════════════════════════════════════════════════════════════
// SLIDE 8 — RESIDUAL KIDNEY FUNCTION & MIDDLE MOLECULES
// ════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBG(s, C.navy);
accentBar(s, 0, 0, 13.3, 0.9, C.teal);
s.addText("BEYOND UREA: RKF, MIDDLE MOLECULES & HIGH-FLUX HD", {
x: 0.3, y: 0.1, w: 12.7, h: 0.7,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle",
});
// RKF
card(s, 0.3, 1.0, 4.1, 5.8, C.lightbg);
sectionTitle(s, "Residual Kidney Function", 0.45, 1.05, 3.8, C.green);
bulletBlock(s, [
"Any native kidney clearance remaining in ESRD patients",
"Even 1–2 mL/min GFR removes ~1.5 L/day of solute",
"Provides continuous clearance between sessions",
"Removes middle molecules, phosphate, sodium",
"Strong predictor of survival in incident dialysis patients",
"Preserved RKF → fewer hospitalizations, better QoL",
"Include Kru in weekly Kt/V: total = Kd + Kru",
"PROTECT-HD: ACE-I/ARB preserves RKF on HD",
"Avoid volume depletion, contrast, aminoglycosides",
"Monitor: 24-hr urine collection monthly",
], 0.45, 1.5, 3.8, 5.1, { fontSize: 10 });
// Middle molecules
card(s, 4.8, 1.0, 4.1, 5.8, C.lightbg);
sectionTitle(s, "Middle Molecules", 4.95, 1.05, 3.8, C.cyan);
bulletBlock(s, [
"MW 500–60,000 Da (vs urea 60 Da)",
"Not well removed by low-flux membranes",
"β₂-microglobulin (MW 11,800 Da) — dialysis amyloid",
"PTH, cytokines, AGEs contribute to uremic syndrome",
"High-flux membranes remove middle molecules",
"Online HDF: convective removal 20–25 L/session",
"CONTRAST trial (2023): survival benefit with HDF",
"ESHOL study: HDF reduced mortality vs low-flux HD",
"High-volume HDF is now preferred where available",
"Standard Kt/V does not capture middle-molecule clearance",
], 4.95, 1.5, 3.8, 5.1, { fontSize: 10 });
// Alternative modalities
card(s, 9.3, 1.0, 3.7, 5.8, C.lightbg);
sectionTitle(s, "Alternative Modalities", 9.45, 1.05, 3.4, C.gold);
bulletBlock(s, [
"Daily short HD (2–2.5 hrs, 5–6×/week)",
"Nocturnal HD: 6–8 hrs, 3–6 nights/week",
"Home hemodialysis: more frequent, patient-controlled",
"Buttonhole needling: improves fistula longevity",
"stdKt/V: best comparator across all modalities",
"Short daily: better phosphate, BP, LVH",
"Nocturnal: best BP, phosphate binder reduction",
"HDF: improved survival in high-volume studies",
"Wearable artificial kidney (WAK): in development",
"Portable HD systems expand home access",
], 9.45, 1.5, 3.4, 5.1, { fontSize: 10 });
s.addText("Brenner & Rector's The Kidney | CONTRAST 2023 | ESHOL Study", {
x: 0.3, y: 7.15, w: 12.7, h: 0.25, fontSize: 8, color: C.muted, fontFace: "Calibri", italic: true, align: "right",
});
}
// ════════════════════════════════════════════════════════════════
// SLIDE 9 — TROUBLESHOOTING INADEQUATE DIALYSIS
// ════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBG(s, C.navy);
accentBar(s, 0, 0, 13.3, 0.9, C.teal);
s.addText("TROUBLESHOOTING INADEQUATE HD ADEQUACY", {
x: 0.3, y: 0.1, w: 12.7, h: 0.7,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle",
});
// Algorithm flow
card(s, 0.3, 1.05, 12.7, 1.15, "0D1E40");
s.addText("⚠ Kt/V below target — Systematic Approach", {
x: 0.5, y: 1.12, w: 12.3, h: 0.5, fontSize: 13, bold: true, color: C.red, fontFace: "Calibri",
});
s.addText("Step 1: Verify sample timing → Step 2: Check treatment time → Step 3: Assess access → Step 4: Review dialyzer → Step 5: Increase frequency", {
x: 0.5, y: 1.62, w: 12.3, h: 0.45, fontSize: 11, color: C.muted, fontFace: "Calibri", italic: true,
});
const trouble = [
{
cause: "Incorrect Sample Timing",
color: C.red,
checks: ["Post-BUN drawn too early (recirculation artifact)", "Slow pump 15-sec technique not used", "Sample from venous line (not arterial)"],
fix: ["Use slow-pump stop-flow method: reduce Qb to 50 mL/min for 15 sec before sampling", "Always sample from arterial line"],
},
{
cause: "Treatment Time Shortened",
color: C.gold,
checks: ["Patient requests early stop", "Machine alarm-related interruptions", "Late start / early end of session"],
fix: ["Document actual vs prescribed time", "Address intradialytic symptoms proactively", "Strict session start time adherence"],
},
{
cause: "Access Recirculation",
color: "E67E22",
checks: ["CVC with high recirculation", "Needle reversal or poor positioning", "Access stenosis causing low Qb"],
fix: ["Fistulogram if access dysfunction suspected", "Correct needle position and orientation", "Replace CVC with AVF/graft if feasible"],
},
{
cause: "Low Blood Flow Rate",
color: C.cyan,
checks: ["Access stenosis, thrombosis", "Arterial collapse or kinking", "Machine pump calibration error"],
fix: ["Verify actual Qb with HD machine", "Treat access stenosis (angioplasty)", "Increase Qb prescription if tolerated"],
},
{
cause: "Dialyzer Issues",
color: C.green,
checks: ["Fibre clotting reducing surface area", "Low KoA dialyzer selected", "Reuse reducing clearance over time"],
fix: ["Optimize anticoagulation to prevent clotting", "Upgrade to high-flux, high-KoA dialyzer", "Limit reuse; test clearance if reused"],
},
{
cause: "Large Body Size / High V",
color: "9B59B6",
checks: ["Large patients: V may be >50 L", "Women: Hemo study shows lower achieved dose", "Obese patients: underestimated V"],
fix: ["Use anthropometric V estimation", "Increase Td or switch to 4×/week", "Consider surface-area normalized dosing"],
},
];
trouble.forEach((t, i) => {
const col = i % 3;
const row = Math.floor(i / 3);
const bx = 0.3 + col * 4.35;
const by = 2.4 + row * 2.45;
card(s, bx, by, 4.15, 2.3, C.lightbg);
accentBar(s, bx, by, 4.15, 0.06, t.color);
s.addText("⚠ " + t.cause, { x: bx + 0.1, y: by + 0.1, w: 3.9, h: 0.38, fontSize: 11, bold: true, color: t.color, fontFace: "Calibri" });
s.addText("Checks:", { x: bx + 0.1, y: by + 0.52, w: 1.8, h: 0.3, fontSize: 9.5, bold: true, color: C.muted, fontFace: "Calibri" });
const crows = t.checks.map((c, j) => ({ text: "• " + c, options: { breakLine: j < t.checks.length - 1, fontSize: 8.8, color: C.white, fontFace: "Calibri" } }));
s.addText(crows, { x: bx + 0.1, y: by + 0.82, w: 3.9, h: 0.68, valign: "top", margin: 1 });
s.addText("Fix:", { x: bx + 0.1, y: by + 1.52, w: 0.5, h: 0.28, fontSize: 9.5, bold: true, color: C.green, fontFace: "Calibri" });
const frows = t.fix.map((f, j) => ({ text: "✓ " + f, options: { breakLine: j < t.fix.length - 1, fontSize: 8.8, color: C.green, fontFace: "Calibri" } }));
s.addText(frows, { x: bx + 0.65, y: by + 1.52, w: 3.35, h: 0.68, valign: "top", margin: 1 });
});
s.addText("KDOQI 2015 | Brenner & Rector's The Kidney, 10th ed.", {
x: 0.3, y: 7.15, w: 12.7, h: 0.25, fontSize: 8, color: C.muted, fontFace: "Calibri", italic: true, align: "right",
});
}
// ════════════════════════════════════════════════════════════════
// SLIDE 10 — SUMMARY & KEY TAKE-AWAYS
// ════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBG(s, C.navy);
accentBar(s, 0, 0, 13.3, 0.9, C.teal);
s.addText("SUMMARY & KEY TAKE-AWAYS", {
x: 0.3, y: 0.1, w: 12.7, h: 0.7,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle",
});
const keymsg = [
{ n: "01", msg: "spKt/V ≥ 1.4 is the minimum target — not the goal. Aim higher for women, large patients, and those with rapid RKF loss." },
{ n: "02", msg: "Vascular access is the single most modifiable determinant of delivered dialysis dose. AVF should be the default access." },
{ n: "03", msg: "Treatment time matters — every minute cut short increases mortality risk. Never allow patient-requested early termination without review." },
{ n: "04", msg: "Residual kidney function is precious. Protect it actively: avoid nephrotoxins, maintain euvolemia, use RAS blockade." },
{ n: "05", msg: "Urea Kt/V does not capture everything. High-flux membranes and HDF address middle-molecule accumulation beyond what spKt/V measures." },
{ n: "06", msg: "Inadequate Kt/V should trigger systematic investigation — check sample timing, access function, and Qb before simply increasing prescription." },
];
keymsg.forEach((k, i) => {
const col = i % 2;
const row = Math.floor(i / 2);
const bx = col === 0 ? 0.3 : 6.85;
const by = 1.05 + row * 2.0;
card(s, bx, by, 6.25, 1.85, C.lightbg);
// Number badge
s.addShape(pres.ShapeType.rect, {
x: bx, y: by, w: 0.65, h: 1.85,
fill: { color: C.teal }, line: { type: "none" },
});
s.addText(k.n, {
x: bx, y: by + 0.55, w: 0.65, h: 0.7,
fontSize: 20, bold: true, color: C.gold, fontFace: "Calibri", align: "center", valign: "middle",
});
s.addText(k.msg, {
x: bx + 0.75, y: by + 0.22, w: 5.35, h: 1.4,
fontSize: 11, color: C.white, fontFace: "Calibri", valign: "middle",
});
});
// Bottom bar
accentBar(s, 0.3, 7.0, 12.7, 0.06, C.gold);
s.addText("Brenner & Rector's The Kidney (10th ed.) · KDOQI 2015 · HEMO Study · ESHOL · CONTRAST 2023 · ERA-EDTA Guidelines", {
x: 0.3, y: 7.1, w: 12.7, h: 0.28,
fontSize: 8.5, color: C.muted, fontFace: "Calibri", italic: true, align: "center",
});
}
// ─── WRITE FILE ──────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/hd-adequacy-poster/HD_Adequacy_Poster.pptx" })
.then(() => console.log("✅ Done: /home/daytona/workspace/hd-adequacy-poster/HD_Adequacy_Poster.pptx"))
.catch(e => { console.error("❌ Error:", e); process.exit(1); });
cd /home/daytona/workspace/hd-adequacy-poster && node build.js 2>&1
HD Adequacy Poster
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 — Title | Overview with 4 key theme boxes |
| 2 — What is HD Adequacy | Definition, historical milestones (NCDS → Hemo Study), scope |
| 3 — Measuring Adequacy | Kt/V (spKt/V, eKt/V, stdKt/V) with Daugirdas II formula + URR side-by-side |
| 4 — Factors Affecting Adequacy | 8 factor cards: Dialyzer, Qb, Qd, Treatment Time, Access, RKF, Patient Factors, Technical |
| 5 — Calculating Kt/V | Step-by-step guide with sample timing method, formulas, interpretation thresholds |
| 6 — Targets & Guidelines | Target boxes (spKt/V ≥1.4, eKt/V ≥1.2, URR >65%, stdKt/V ≥2.0/wk) + KDOQI/KDIGO/ERA-EDTA comparison table |
| 7 — How to Improve | 8 strategy cards: extend time, optimize access, increase Qb/Qd, upgrade dialyzer, increase frequency, preserve RKF, patient education |
| 8 — Beyond Urea | Residual kidney function, middle molecules (β₂-microglobulin), HDF/high-flux membranes, alternative modalities |
| 9 — Troubleshooting | 6 common causes of inadequate Kt/V with systematic checks and fixes |
| 10 — Key Take-Aways | 6 evidence-based summary points |
Make it in poster form
~/hd-adequacy-poster/poster.js
/**
* HD ADEQUACY — Academic Conference Poster
* Format: A0 Landscape ~46.8" × 33.1" (scaled to pptxgenjs units)
* Layout: 1 slide, 5 columns
*/
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
// A0 landscape: 1189 mm × 841 mm → 46.81" × 33.11"
const W = 46.81;
const H = 33.11;
pres.defineLayout({ name: "A0_LAND", width: W, height: H });
pres.layout = "A0_LAND";
pres.title = "Hemodialysis Adequacy — Conference Poster";
// ── PALETTE ──────────────────────────────────────────────────
const C = {
navy: "0A1A3A",
teal: "0C6B70",
cyan: "10A0B0",
gold: "F0A020",
white: "FFFFFF",
offwhite:"E4F0F5",
card: "0F2248",
muted: "8AAFBF",
red: "D94F4F",
green: "2EAD6A",
purple: "8B52C0",
orange: "E06820",
blue: "4A7FC1",
};
const s = pres.addSlide();
// ── HELPERS ──────────────────────────────────────────────────
function rect(x,y,w,h,fill,lineCol,lw){
s.addShape(pres.ShapeType.rect,{x,y,w,h,
fill:{color:fill||C.navy},
line: lineCol ? {color:lineCol,pt:lw||1.5} : {type:"none"}});
}
function rrect(x,y,w,h,fill,lineCol,lw){
s.addShape(pres.ShapeType.roundRect,{x,y,w,h,rectRadius:0.15,
fill:{color:fill||C.card},
line: lineCol ? {color:lineCol,pt:lw||1.5} : {type:"none"}});
}
function txt(text,x,y,w,h,opts){
s.addText(text,{x,y,w,h,...opts});
}
function htxt(text,x,y,w,h,size,color,bold,align,italic){
txt(text,x,y,w,h,{fontSize:size,color:color||C.white,bold:!!bold,
fontFace:"Calibri",align:align||"left",valign:"top",italic:!!italic});
}
function secHead(label,x,y,w,color){
rect(x,y,w,0.09,color||C.gold);
htxt(label.toUpperCase(),x,y+0.1,w,0.7,13.5,color||C.gold,true);
}
function bullets(items,x,y,w,h,size,color){
const rows=items.map((t,i)=>({
text:"• "+t,
options:{breakLine:i<items.length-1,fontSize:size||9.5,
color:color||C.white,fontFace:"Calibri"}}));
s.addText(rows,{x,y,w,h,valign:"top",margin:3});
}
function kv(label,val,x,y,w,h,vColor){
rrect(x,y,w,h,C.card,C.teal,1);
rect(x,y,w,0.07,vColor||C.gold);
htxt(label,x+0.12,y+0.12,w-0.24,0.55,10.5,C.muted,false);
htxt(val,x+0.12,y+0.62,w-0.24,h-0.75,22,C.white,true,"center");
}
// ══════════════════════════════════════════════════════════════
// BACKGROUND
// ══════════════════════════════════════════════════════════════
rect(0,0,W,H,C.navy);
// Top banner gradient strip
rect(0,0,W,4.4,C.teal);
rect(0,3.9,W,0.55,"0A1A3A"); // fade bottom
// Decorative side bars
rect(0,0,0.35,H,C.teal);
rect(W-0.35,0,0.35,H,C.gold);
// ══════════════════════════════════════════════════════════════
// HEADER
// ══════════════════════════════════════════════════════════════
htxt("HEMODIALYSIS ADEQUACY",
0.6, 0.35, W-1.2, 2.1, 64, C.white, true, "center");
rect(6, 2.55, W-12, 0.1, C.gold);
htxt("Measurement · Determinants · Targets · Strategies to Improve · Troubleshooting",
0.6, 2.7, W-1.2, 0.9, 18, C.offwhite, false, "center", true);
htxt("Source: Brenner & Rector's The Kidney (10th ed.) · KDOQI 2015 · HEMO Study · KDIGO 2012 · ERA-EDTA Guidelines",
0.6, 3.6, W-1.2, 0.65, 11, C.muted, false, "center", true);
// ══════════════════════════════════════════════════════════════
// LAYOUT: 5 columns
// Column widths (inches): 8.8 9.0 9.5 9.5 9.0
// ══════════════════════════════════════════════════════════════
const TOP = 4.8; // top of content area
const BOT = H - 1.2; // bottom of content area
const CH = BOT - TOP; // usable column height ~27"
const COL = [
{ x: 0.55, w: 8.8 },
{ x: 9.85, w: 9.0 },
{ x: 19.35, w: 9.5 },
{ x: 29.35, w: 9.0 },
{ x: 38.85, w: 7.61 },
];
// Thin column dividers
[9.55, 19.05, 28.95, 38.55].forEach(dx=>{
rect(dx, TOP-0.3, 0.04, CH+0.4, "1A3A5A");
});
// ══════════════════════════════════════════════════════════════
// COL 1 — What is Adequacy + Historical + Scope
// ══════════════════════════════════════════════════════════════
{
const {x,w}=COL[0];
let y=TOP;
// Definition block
rrect(x,y,w,3.6,C.card,C.teal,1.5);
rect(x,y,w,0.09,C.gold);
htxt("WHAT IS HD ADEQUACY?",x+0.15,y+0.15,w-0.3,0.7,13.5,C.gold,true);
s.addText([
{text:"Definition: ",options:{bold:true,color:C.gold,fontSize:11,fontFace:"Calibri"}},
{text:"The sufficiency of solute and water removal during dialysis, primarily quantified by the fractional urea clearance (Kt/V), to maintain patient health and reduce uremic morbidity and mortality.",
options:{color:C.white,fontSize:10.5,fontFace:"Calibri"}},
],{x:x+0.15,y:y+0.9,w:w-0.3,h:1.5,valign:"top"});
htxt("Primary goal: removal of uremic toxins (urea as surrogate).\nConsiders both solute removal AND fluid balance (UF).\nSeparate from anemia, nutrition, and CVD management.",
x+0.15,y+2.5,w-0.3,1.0,9.8,C.muted,false,"left",true);
y+=3.9;
// Historical milestones
rrect(x,y,w,7.8,C.card,C.teal,1.5);
secHead("Historical Milestones",x+0.15,y+0.1,w-0.3,C.gold);
const hist=[
"1973 — Medicare funded ESRD dialysis; adequacy largely ignored",
"1974 — National Cooperative Dialysis Study (NCDS) launched by NIH",
"NCDS aimed to control BUN at 50 vs 100 mg/dL; found strong Kt/V–outcome link",
"Subsequent studies: mortality risk rises sharply when spKt/V < 1.2",
"Hemo Study (NIH, late 1990s): no benefit from spKt/V > 1.3 with 3×/week HD",
"Dose targeting bias identified: failure to reach target = independent mortality risk",
"KDOQI 2015: minimum target raised to spKt/V ≥ 1.4 per session",
"Guidelines now mandate Kt/V monitoring standards worldwide",
];
bullets(hist,x+0.15,y+1.0,w-0.3,6.6,10);
y+=8.1;
// Scope
rrect(x,y,w,6.6,C.card,C.teal,1.5);
secHead("Scope of Adequacy",x+0.15,y+0.1,w-0.3,C.cyan);
bullets([
"Urea: small-MW surrogate; not the only uremic toxin",
"Middle molecules (500–60,000 Da): not captured by Kt/V",
"Protein-bound toxins (indoxyl sulfate, p-cresol) poorly dialyzed",
"Residual kidney function (RKF) contributes between sessions",
"Global kidney replacement ≠ dialysis adequacy alone",
"Adequacy ≠ treating anemia, CKD-MBD, or nutrition",
],x+0.15,y+1.0,w-0.3,5.4,10);
y+=6.9;
// URR
rrect(x,y,w,7.8,C.card,C.orange,1.5);
secHead("URR — Urea Reduction Ratio",x+0.15,y+0.1,w-0.3,C.orange);
rrect(x+0.15,y+1.0,w-0.3,1.2,"0A1428",C.orange,1.5);
htxt("URR = (C₀ − Cf) / C₀ × 100%",
x+0.15,y+1.1,w-0.3,0.9,18,C.gold,true,"center");
htxt("C₀ = pre-dialysis BUN · Cf = post-dialysis BUN",
x+0.15,y+2.3,w-0.3,0.5,9.5,C.muted,false,"center",true);
bullets([
"Target: URR > 65% minimum",
"Simple; requires only pre & post BUN",
"Does NOT account for ultrafiltration volume",
"Less accurate than Kt/V — replaced as CMS metric",
"URR paradoxically decreases as dialysis frequency increases",
"Cannot be summed across multiple sessions",
"Still useful as a quick bedside adequacy check",
],x+0.15,y+2.9,w-0.3,4.7,10,C.white);
y+=8.1;
}
// ══════════════════════════════════════════════════════════════
// COL 2 — Kt/V in detail + calculation steps
// ══════════════════════════════════════════════════════════════
{
const {x,w}=COL[1];
let y=TOP;
// Kt/V overview
rrect(x,y,w,7.5,C.card,C.teal,1.5);
secHead("Kt/V — The Gold Standard",x+0.15,y+0.1,w-0.3,C.teal);
s.addText([
{text:"K",options:{bold:true,color:C.cyan,fontSize:13,fontFace:"Calibri"}},
{text:" = urea clearance (mL/min) ",options:{color:C.white,fontSize:11,fontFace:"Calibri"}},
{text:"t",options:{bold:true,color:C.cyan,fontSize:13,fontFace:"Calibri"}},
{text:" = treatment time (min) ",options:{color:C.white,fontSize:11,fontFace:"Calibri"}},
{text:"V",options:{bold:true,color:C.cyan,fontSize:13,fontFace:"Calibri"}},
{text:" = urea distribution volume (body water)",options:{color:C.white,fontSize:11,fontFace:"Calibri"}},
],{x:x+0.15,y:y+1.0,w:w-0.3,h:0.75,valign:"middle"});
bullets([
"spKt/V (single-pool): standard clinical measure from pre/post BUN",
"eKt/V (equilibrated): corrects for post-dialysis urea rebound",
"stdKt/V (standard): allows comparison across all frequencies & modalities",
"Double-pool Kt/V: most accurate; accounts for compartment redistribution",
"Minimum: spKt/V ≥ 1.4 | eKt/V ≥ 1.2 | stdKt/V ≥ 2.0/week",
"Women & small patients may need higher weight-normalized dose",
],x+0.15,y+1.85,w-0.3,5.4,10);
y+=7.8;
// Daugirdas formula
rrect(x,y,w,4.6,C.card,C.gold,2);
rect(x,y,w,0.1,C.gold);
htxt("DAUGIRDAS II FORMULA",x+0.15,y+0.2,w-0.3,0.7,13.5,C.gold,true);
rrect(x+0.15,y+1.0,w-0.3,1.8,"060F20",C.cyan,1.5);
htxt("spKt/V = −ln(R − 0.008 × t) + (4 − 3.5R) × UF/W",
x+0.15,y+1.2,w-0.3,1.2,15.5,C.gold,true,"center");
htxt("R = Cf/C₀ · t = treatment time (min) · UF = ultrafiltrate (L) · W = post-HD weight (kg)",
x+0.15,y+2.9,w-0.3,0.5,9,C.muted,false,"center",true);
htxt("Tattersall eKt/V: eKt/V = spKt/V × (1 − 0.6/t) + 0.03",
x+0.15,y+3.5,w-0.3,0.8,10,C.cyan,false,"center");
y+=4.9;
// Step-by-step
rrect(x,y,w,20.1,C.card,C.teal,1.5);
secHead("Calculation — Step by Step",x+0.15,y+0.1,w-0.3,C.cyan);
const steps=[
{n:"1",t:"Collect Blood Samples",d:"Pre-BUN (C₀): draw BEFORE session begins.\nPost-BUN (Cf): at end — slow pump to 50 mL/min × 15 sec BEFORE sampling to avoid recirculation artifact."},
{n:"2",t:"Record Session Parameters",d:"• Treatment time (t) in minutes\n• Post-dialysis body weight (W) in kg\n• Ultrafiltration volume (UF) = pre-weight − post-weight in litres"},
{n:"3",t:"Calculate R",d:"R = Cf / C₀\nExample: pre-BUN = 60 mg/dL, post-BUN = 18 mg/dL\n→ R = 18 ÷ 60 = 0.30"},
{n:"4",t:"Apply Daugirdas II",d:"With t=240, UF=2.5 L, W=70 kg:\nspKt/V = −ln(0.30 − 0.008×240) + (4 − 3.5×0.30) × 2.5/70\n = −ln(−0.62) not valid → indicates formula sensitivity to timing"},
{n:"5",t:"Interpret the Result",d:"≥ 1.4: Adequate ✓\n1.2 – 1.39: Borderline — investigate\n< 1.2: Inadequate — immediate intervention"},
{n:"6",t:"Equilibrated Kt/V",d:"eKt/V = spKt/V × (1 − 0.6/t) + 0.03\nTarget: eKt/V ≥ 1.2\nPreferred for short treatments or when rebound expected"},
];
steps.forEach((st,i)=>{
const by=y+1.2+i*3.1;
s.addShape(pres.ShapeType.ellipse,{x:x+0.15,y:by+0.05,w:0.85,h:0.85,
fill:{color:C.gold},line:{type:"none"}});
htxt(st.n,x+0.15,by+0.1,0.85,0.75,18,C.navy,true,"center");
htxt(st.t,x+1.15,by,w-1.35,0.6,11.5,C.cyan,true);
htxt(st.d,x+1.15,by+0.65,w-1.35,2.3,9.5,C.white,false);
});
y+=20.4;
}
// ══════════════════════════════════════════════════════════════
// COL 3 — Factors affecting adequacy (8 factors)
// ══════════════════════════════════════════════════════════════
{
const {x,w}=COL[2];
let y=TOP;
rrect(x,y,w,0.65,"0A1630",C.teal,1.5);
htxt("FACTORS AFFECTING HD ADEQUACY",x+0.15,y+0.08,w-0.3,0.5,14.5,C.white,true,"center");
y+=0.85;
const factors=[
{t:"1. Dialyzer (Artificial Kidney)",c:C.teal,items:[
"KoA: mass transfer coeff × area — primary dialyzer property",
"High-flux > low-flux: removes β₂-microglobulin & middle molecules",
"Larger surface area (2.0–2.2 m²) → higher clearance",
"Dialyzer reuse: each reuse decreases effective clearance",
"Fibre clotting reduces functional surface area",
]},
{t:"2. Blood Flow Rate (Qb)",c:C.cyan,items:[
"Standard target: 350–500 mL/min",
"Higher Qb → increased urea clearance (K)",
"Limited by vascular access function",
"Access recirculation reduces effective Qb",
"Verify actual pump speed matches delivered flow",
]},
{t:"3. Dialysate Flow Rate (Qd)",c:C.blue,items:[
"Standard: 500 mL/min; increase to 800 mL/min for +10% Kt/V",
"Counter-current flow maximizes concentration gradient",
"Online HDF uses high Qd for convective clearance",
"Cost and machine limits may restrict Qd increase",
]},
{t:"4. Treatment Time (Td)",c:C.gold,items:[
"Conventional: 3–4.5 hours, 3×/week",
"Longer Td → better solute + fluid removal",
"Patient shortening of sessions = major risk for inadequacy",
"Prospective studies favour prolonged treatment times",
"Nocturnal/extended HD: superior adequacy profile",
]},
{t:"5. Vascular Access",c:C.red,items:[
"AVF (preferred): lowest recirculation (~5–8%)",
"AV graft: moderate recirculation",
"CVC (central catheter): highest recirculation — avoid long term",
"Needle position: reversal can double recirculation",
"Stenosis causes low Qb and high recirculation simultaneously",
]},
{t:"6. Residual Kidney Function (RKF)",c:C.green,items:[
"Continuous clearance between HD sessions",
"Even 1–2 mL/min GFR removes ~1.5 L/day of solute",
"Removes middle molecules, Na⁺, phosphate, water",
"Strong independent predictor of survival",
"Include Kru in total weekly Kt/V calculation",
]},
{t:"7. Patient-Related Factors",c:C.purple,items:[
"Body size: larger V (urea distribution volume) → harder target",
"Gender: women may need higher dose (Hemo Study)",
"Urea generation rate (G): reflects protein catabolism",
"Post-dialysis urea rebound can overestimate clearance",
"Compliance: skipping/shortening sessions = inadequate dose",
]},
{t:"8. Technical & Prescription Errors",c:C.orange,items:[
"Incorrect blood sampling timing — most common error",
"Slow pump speed at session start/end",
"Clotted air traps reduce effective blood volume",
"Inadequate anticoagulation causes circuit clotting",
"Wrong dialyzer selected (low KoA for large patient)",
]},
];
factors.forEach((f,i)=>{
const bh=3.55;
rrect(x,y,w,bh,C.card,f.c,1.2);
rect(x,y,0.1,bh,f.c);
htxt(f.t,x+0.25,y+0.1,w-0.35,0.55,11,f.c,true);
bullets(f.items,x+0.25,y+0.68,w-0.35,bh-0.8,9.5);
y+=bh+0.2;
});
}
// ══════════════════════════════════════════════════════════════
// COL 4 — Targets + How to Improve
// ══════════════════════════════════════════════════════════════
{
const {x,w}=COL[3];
let y=TOP;
// Target boxes
rrect(x,y,w,0.65,"0A1630",C.gold,1.5);
htxt("GUIDELINE TARGETS",x+0.15,y+0.08,w-0.3,0.5,14.5,C.white,true,"center");
y+=0.85;
const targets=[
{label:"spKt/V per session",val:"≥ 1.4",note:"KDOQI 2015",c:C.green},
{label:"eKt/V (equilibrated)",val:"≥ 1.2",note:"Tattersall correction",c:C.cyan},
{label:"URR minimum",val:"> 65%",note:"CMS monitoring",c:C.gold},
{label:"stdKt/V weekly",val:"≥ 2.0/wk",note:"All modalities",c:C.purple},
];
targets.forEach((t,i)=>{
const bx=x+(i%2)*(w/2+0.08);
const by=y+Math.floor(i/2)*2.45;
const bw=w/2-0.1;
rrect(bx,by,bw,2.3,C.card,t.c,1.5);
rect(bx,by,bw,0.09,t.c);
htxt(t.label,bx+0.1,by+0.15,bw-0.2,0.55,9.5,C.muted,false,"center");
htxt(t.val,bx,by+0.75,bw,0.95,28,C.white,true,"center");
htxt(t.note,bx,by+1.75,bw,0.42,9,t.c,true,"center");
});
y+=5.3;
// Guidelines table
rrect(x,y,w,4.2,C.card,C.teal,1.5);
secHead("Guidelines Comparison",x+0.15,y+0.1,w-0.3,C.teal);
rect(x,y+1.0,w,0.5,"0D2244");
const hcols=["Guideline","Min spKt/V","Target","Notes"];
const hcw=[3.0,1.5,1.5,2.8];
let cx=x+0.1;
hcols.forEach((h,i)=>{htxt(h,cx,y+1.05,hcw[i],0.4,9.5,C.gold,true); cx+=hcw[i]+0.05;});
const grows=[
["KDOQI 2015","1.2","1.4","Higher for women"],
["KDIGO 2012","1.2","1.4","Adjust for RKF"],
["ERA-EDTA","1.2","1.4","stdKt/V preferred"],
["UK Renal Assoc.","1.2","1.4","High-flux memb."],
];
grows.forEach((r,ri)=>{
rect(x,y+1.5+ri*0.62,w,0.6,ri%2?"0D1E40":"091630");
let cx2=x+0.1;
r.forEach((cell,ci)=>{
htxt(cell,cx2,y+1.55+ri*0.62,hcw[ci],0.52,9.2,ci===0?C.cyan:C.white,ci===0);
cx2+=hcw[ci]+0.05;
});
});
y+=4.5;
// How to Improve
rrect(x,y,w,0.65,"0A1630",C.green,1.5);
htxt("HOW TO IMPROVE ADEQUACY",x+0.15,y+0.08,w-0.3,0.5,14.5,C.white,true,"center");
y+=0.85;
const strategies=[
{icon:"🕐",t:"Extend Treatment Time",c:C.gold,items:[
"Increase session from 3 → 4–4.5 hours",
"Nocturnal HD (6–8 hrs, 3–6×/week): superior adequacy",
"Longer time → lower UF rate → fewer cramps",
]},
{icon:"💉",t:"Optimize Vascular Access",c:C.red,items:[
"Promote AVF; avoid long-term CVC",
"Treat access stenosis promptly (fistulogram + PTA)",
"Correct needle placement; avoid reversal",
]},
{icon:"⚡",t:"Increase Blood Flow Rate",c:C.cyan,items:[
"Target Qb 400–500 mL/min if access allows",
"Treat stenosis limiting Qb achievement",
"Verify actual pump delivery matches prescription",
]},
{icon:"💧",t:"Increase Dialysate Flow",c:C.blue,items:[
"Increase Qd 500 → 800 mL/min: ~10% Kt/V gain",
"Counter-current flow configuration",
"Online HDF: convective volumes 20–25 L/session",
]},
{icon:"🔬",t:"Upgrade Dialyzer",c:C.green,items:[
"Switch to high-flux, high-KoA membrane",
"Larger area (2.0–2.2 m²) for large patients",
"Limit reuse; test clearance if reuse programme",
]},
{icon:"📅",t:"Increase Frequency",c:C.purple,items:[
"5–6×/week short daily HD: better phosphate & BP",
"Home HD: flexible schedule for higher dose",
"More frequent dialysis preserves RKF",
]},
{icon:"🩺",t:"Preserve RKF",c:C.teal,items:[
"Avoid NSAIDs, IV contrast, aminoglycosides",
"Maintain euvolemia — prevent hypovolemia",
"ACE-I/ARB may slow RKF loss",
]},
{icon:"📋",t:"Prescription & Education",c:C.orange,items:[
"Never allow session shortening without review",
"Correct post-BUN sampling with slow-pump method",
"Review adequacy data monthly; adjust prescription",
]},
];
strategies.forEach((st,i)=>{
const bh=3.35;
rrect(x,y,w,bh,C.card,st.c,1.2);
rect(x,y,0.1,bh,st.c);
htxt(st.icon+" "+st.t,x+0.25,y+0.1,w-0.35,0.58,11,st.c,true);
bullets(st.items,x+0.25,y+0.72,w-0.35,bh-0.85,9.5);
y+=bh+0.18;
});
}
// ══════════════════════════════════════════════════════════════
// COL 5 — Troubleshooting + RKF + Middle Molecules + Summary
// ══════════════════════════════════════════════════════════════
{
const {x,w}=COL[4];
let y=TOP;
// Troubleshooting
rrect(x,y,w,0.65,"0A1630",C.red,1.5);
htxt("TROUBLESHOOTING LOW Kt/V",x+0.12,y+0.08,w-0.24,0.5,13.5,C.white,true,"center");
y+=0.85;
const trouble=[
{cause:"Sample Timing Error",c:C.red,
check:"Post-BUN drawn too early; no slow-pump technique used",
fix:"Slow pump to 50 mL/min × 15 sec; sample arterial port"},
{cause:"Short Treatment Time",c:C.gold,
check:"Patient requests early stop; late start; alarm interruptions",
fix:"Document actual time; address symptoms proactively"},
{cause:"Access Recirculation",c:C.orange,
check:"CVC, reversed needles, or access stenosis",
fix:"Fistulogram if dysfunction; correct needle orientation"},
{cause:"Low Blood Flow (Qb)",c:C.cyan,
check:"Stenosis, arterial collapse, pump calibration error",
fix:"Treat stenosis; verify actual pump delivery rate"},
{cause:"Dialyzer Clotting/Reuse",c:C.green,
check:"Fibre clotting, inadequate anticoagulation, reuse decline",
fix:"Optimize heparin; limit reuse; check KoA periodically"},
{cause:"Large Body Size (↑V)",c:C.purple,
check:"V > 50 L in large patients; underestimated in obese",
fix:"Increase Td or frequency; use anthropometric V estimate"},
];
trouble.forEach((t,i)=>{
const bh=3.6;
rrect(x,y,w,bh,C.card,t.c,1.2);
rect(x,y,0.1,bh,t.c);
htxt("⚠ "+t.cause,x+0.25,y+0.08,w-0.35,0.55,11,t.c,true);
htxt("CHECK: "+t.check,x+0.25,y+0.7,w-0.35,0.9,9.2,C.muted,false,"left",true);
htxt("FIX: "+t.fix,x+0.25,y+1.65,w-0.35,1.7,9.5,C.green,false);
y+=bh+0.18;
});
// Middle molecules / HDF
rrect(x,y,w,7.5,C.card,C.cyan,1.5);
secHead("Beyond Urea: Middle Molecules & HDF",x+0.15,y+0.1,w-0.24,C.cyan);
bullets([
"MW 500–60,000 Da — not removed by low-flux membranes",
"β₂-microglobulin (11,800 Da): dialysis-related amyloid",
"High-flux membranes remove middle molecules",
"Online HDF: convective volumes 20–25 L/session",
"ESHOL & CONTRAST 2023: HDF reduces mortality vs low-flux HD",
"Standard Kt/V does NOT capture middle-molecule clearance",
"High-volume HDF now preferred in Europe where available",
],x+0.15,y+1.0,w-0.3,6.3,10);
y+=7.8;
// RKF
rrect(x,y,w,5.8,C.card,C.green,1.5);
secHead("Residual Kidney Function (RKF)",x+0.15,y+0.1,w-0.24,C.green);
bullets([
"Even 1–2 mL/min GFR clears ~1.5 L/day of solute",
"Continuous clearance between HD sessions (Kd=0 off dialysis)",
"Removes phosphate, Na⁺, middle molecules",
"Strong predictor of survival — protect at all costs",
"Include Kru in total weekly Kt/V (Kd + Kru)",
"Avoid nephrotoxins; RAS blockade may slow RKF decline",
],x+0.15,y+1.0,w-0.3,4.6,10);
y+=6.1;
// Key takeaways
rrect(x,y,w,0.65,"0A1630",C.gold,1.5);
htxt("KEY TAKE-AWAYS",x+0.15,y+0.08,w-0.3,0.5,14.5,C.white,true,"center");
y+=0.85;
const msgs=[
{n:"01",m:"spKt/V ≥ 1.4 is the minimum — not the goal. Aim higher for women and large patients.",c:C.green},
{n:"02",m:"Vascular access is the most modifiable determinant of delivered dialysis dose.",c:C.red},
{n:"03",m:"Every minute of treatment cut short increases mortality risk — never shorten without review.",c:C.gold},
{n:"04",m:"RKF is precious. Protect it: avoid nephrotoxins, maintain euvolemia, use RAS blockade.",c:C.cyan},
{n:"05",m:"High-flux/HDF addresses middle-molecule toxicity that Kt/V alone cannot capture.",c:C.purple},
{n:"06",m:"Low Kt/V: always check sample timing FIRST before adjusting prescription.",c:C.orange},
];
msgs.forEach((m,i)=>{
rrect(x,y,w,2.55,C.card,m.c,1.2);
rect(x,y,0.7,2.55,m.c+"55");
htxt(m.n,x,y+0.65,0.7,1.0,22,C.white,true,"center");
htxt(m.m,x+0.85,y+0.28,w-1.0,1.9,10.5,C.white,false,"left");
y+=2.75;
});
}
// ══════════════════════════════════════════════════════════════
// FOOTER
// ══════════════════════════════════════════════════════════════
rect(0,H-1.0,W,1.0,C.teal);
rect(0,H-1.0,W,0.06,C.gold);
htxt(
"Brenner & Rector's The Kidney (10th ed.) · KDOQI Clinical Practice Guidelines 2015 · HEMO Study (NEJM 2002) · KDIGO 2012 · ERA-EDTA Guidelines · ESHOL Study · CONTRAST Trial 2023",
0.6,H-0.82,W-1.2,0.6,10.5,C.offwhite,false,"center",true);
// ── OUTPUT ───────────────────────────────────────────────────
pres.writeFile({fileName:"/home/daytona/workspace/hd-adequacy-poster/HD_Adequacy_Conference_Poster.pptx"})
.then(()=>console.log("✅ Poster saved."))
.catch(e=>{console.error("❌",e);process.exit(1);});
cd /home/daytona/workspace/hd-adequacy-poster && node poster.js 2>&1
~/hd-adequacy-poster/poster.js
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/hd-adequacy-poster/poster.js'
cd /home/daytona/workspace/hd-adequacy-poster && node poster.js 2>&1
HD Adequacy Conference Poster
Presentation · PPTX
| Column | Content |
|---|---|
| Col 1 | What is HD Adequacy · Historical milestones (NCDS → Hemo Study) · Scope · URR formula & limitations |
| Col 2 | Kt/V types (sp/eq/std) · Daugirdas II formula box · Step-by-step calculation guide (6 steps with circles) |
| Col 3 | 8 factor cards with colored side-bars: Dialyzer, Qb, Qd, Treatment Time, Access, RKF, Patient factors, Technical errors |
| Col 4 | 4 target boxes (spKt/V ≥1.4, eKt/V ≥1.2, URR >65%, stdKt/V ≥2.0/wk) · Guidelines comparison table · 8 improvement strategy cards |
| Col 5 | Troubleshooting 6 causes (with Check/Fix format) · Beyond Urea: middle molecules & HDF · RKF section · 6 key take-away badges |