Scola for ventral hernia in depth master this
SCOLA subcutaneous onlay laparoscopic approach ventral hernia
PMID: 41667727
PMID: 39730131
PMID: 39506083

| Indication | Details |
|---|---|
| Primary midline ventral hernias | Umbilical, epigastric hernias |
| Small-to-medium defects | Typically <4 cm width |
| Diastasis recti | Inter-rectus distance >2-2.5 cm; SCOLA uniquely addresses both simultaneously |
| Coexisting hernia + diastasis | The primary "sweet spot" indication |
| Patients not requiring dermolipectomy | Those who do not need skin/fat removal (no skin excess) |
| Desire to avoid peritoneal entry | High prior adhesions but mesh in onlay plane preferred |
| Port | Size | Position |
|---|---|---|
| Midline suprapubic | 11 mm | Camera port |
| Left lateral suprapubic | 5 mm | Working port |
| Right lateral suprapubic | 5 mm | Working port |
| Factor | SCOLA Onlay Placement |
|---|---|
| Mesh type | Polypropylene (standard, non-coated) |
| Barrier coat required? | No - extraperitoneal position |
| Overlap | ≥3-5 cm in all directions |
| Contact with viscera | None |
| Cost | Lower than barrier/composite IPOM mesh |
| Feature | SCOLA | IPOM | IPOM+ | Open Onlay | Rives-Stoppa/eTEP |
|---|---|---|---|---|---|
| Peritoneal entry | No | Yes | Yes | No | No/partial |
| Mesh position | Onlay (subcutaneous) | Intraperitoneal | Intraperitoneal | Onlay | Retromuscular |
| Barrier mesh needed | No | Yes | Yes | No | No |
| Defect closure | Yes | Sometimes | Yes | Yes | Yes |
| Diastasis repair | Yes | No | No | Yes | Limited |
| Post-op pain | Low | Moderate-high | Moderate | High | Moderate |
| SSI risk | Moderate | Low | Low | High (up to 20%) | Low |
| Seroma risk | High (~19-27%) | ~10% | ~10% | High | Moderate |
| Ideal defect size | <4 cm | <10 cm | <10 cm | Any | 4-10 cm |
| Complexity | Moderate | Low-moderate | Moderate | Moderate | High |
| Complication | Rate | Notes |
|---|---|---|
| Seroma | 19-27% (most common) | Related to extent of subcutaneous dissection, not mesh use per se |
| Surgical site infection (SSI) | ~5% (mesh group) | Only seen when mesh used; 0% in no-mesh series |
| Recurrence | ~1.7% (mesh), 0% (no mesh) | Very low at short follow-up |
| Umbilical necrosis | Rare | From umbilical stalk transection |
| Wound infection | Uncommon | Subcutaneous approach risk |
| Study | Design | N | Key Finding |
|---|---|---|---|
| Vitiello 2026 [PMID: 41667727] | SR + Meta-analysis | 247 | Low recurrence (1.7%), seroma 19%, SSI 5% with mesh; seroma driven by dissection extent |
| Mehta 2024 [PMID: 39506083] | Prospective obs. | 33 | 0% recurrence, 90.9% satisfaction |
| Deshpande 2024 [PMID: 39730131] | Prospective obs. | 51 | SCOLA = less pain, lower cost vs. IPOM+; higher seroma (27% vs. 10%) |
| Dong 2021 [PMID: 33206243] | Case series | Initial US series | Feasibility confirmed for small midline hernias + diastasis |
| Shinde 2022 [PMID: 35859952] | Case series | Indian modification | Novel technique variant |
Generate a complication management flowchart for seroma and infection after SCOLA
ls -la /tmp/workspace/ 2>/dev/null || echo "workspace empty or missing"
mkdir -p /tmp/workspace/scola-flowchart && python3 << 'PYEOF' import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.patches as mpatches from matplotlib.patches import FancyBboxPatch, FancyArrowPatch import matplotlib.patheffects as pe fig, ax = plt.subplots(figsize=(22, 30)) ax.set_xlim(0, 22) ax.set_ylim(0, 30) ax.axis('off') fig.patch.set_facecolor('#F0F4F8') # ── Color palette ────────────────────────────────────────────────────────────── C = { 'title_bg' : '#1A2E4A', 'title_fg' : '#FFFFFF', 'start' : '#2C5F8A', 'start_fg' : '#FFFFFF', 'decision' : '#E07B2A', 'decision_fg' : '#FFFFFF', 'action' : '#2A7A4B', 'action_fg' : '#FFFFFF', 'warning' : '#C0392B', 'warning_fg' : '#FFFFFF', 'info' : '#5B4C8A', 'info_fg' : '#FFFFFF', 'success' : '#1D6A3E', 'success_fg' : '#FFFFFF', 'seroma_hdr' : '#2C5F8A', 'infect_hdr' : '#8A2C2C', 'arrow' : '#34495E', 'note_bg' : '#FFF9E6', 'note_border' : '#E6B800', } def box(ax, x, y, w, h, text, facecolor, textcolor='white', fontsize=9, style='round,pad=0.1', bold=False, wrap=True, zorder=3): b = FancyBboxPatch((x - w/2, y - h/2), w, h, boxstyle=style, linewidth=1.2, edgecolor='#2C3E50', facecolor=facecolor, zorder=zorder) ax.add_patch(b) weight = 'bold' if bold else 'normal' ax.text(x, y, text, ha='center', va='center', fontsize=fontsize, color=textcolor, fontweight=weight, wrap=wrap, zorder=zorder+1, multialignment='center') def diamond(ax, x, y, w, h, text, facecolor, textcolor='white', fontsize=8.5): dx, dy = w/2, h/2 pts = [(x, y+dy), (x+dx, y), (x, y-dy), (x-dx, y)] poly = plt.Polygon(pts, closed=True, facecolor=facecolor, edgecolor='#2C3E50', linewidth=1.2, zorder=3) ax.add_patch(poly) ax.text(x, y, text, ha='center', va='center', fontsize=fontsize, color=textcolor, fontweight='bold', zorder=4, multialignment='center') def arrow(ax, x1, y1, x2, y2, label='', color='#34495E', lw=1.8): ax.annotate('', xy=(x2, y2), xytext=(x1, y1), arrowprops=dict(arrowstyle='->', color=color, lw=lw, connectionstyle='arc3,rad=0.0')) if label: mx, my = (x1+x2)/2, (y1+y2)/2 ax.text(mx+0.15, my, label, fontsize=8, color=color, fontweight='bold') def harrow(ax, x1, y1, x2, y2, label='', color='#34495E'): """Horizontal then vertical arrow via bent path""" ax.annotate('', xy=(x2, y2), xytext=(x1, y1), arrowprops=dict(arrowstyle='->', color=color, lw=1.8, connectionstyle=f'angle,angleA=0,angleB=90')) if label: mx = (x1+x2)/2 ax.text(mx, y1+0.12, label, fontsize=8, color=color, fontweight='bold', ha='center') # ══════════════════════════════════════════════════════════════════════════════ # TITLE BANNER # ══════════════════════════════════════════════════════════════════════════════ title_bg = FancyBboxPatch((0.3, 28.3), 21.4, 1.5, boxstyle='round,pad=0.05', linewidth=0, facecolor=C['title_bg'], zorder=5) ax.add_patch(title_bg) ax.text(11, 29.15, 'COMPLICATION MANAGEMENT FLOWCHART AFTER SCOLA', ha='center', va='center', fontsize=15, color='white', fontweight='bold', zorder=6) ax.text(11, 28.65, 'SubCutaneous OnLay Laparoscopic/Endoscopic Approach | Seroma & Surgical Site Infection (SSI)', ha='center', va='center', fontsize=9.5, color='#B8D4F0', zorder=6) # ══════════════════════════════════════════════════════════════════════════════ # COLUMN HEADERS # ══════════════════════════════════════════════════════════════════════════════ # Left column: Seroma | Right column: SSI seroma_hdr = FancyBboxPatch((0.3, 27.0), 10.2, 0.9, boxstyle='round,pad=0.05', linewidth=0, facecolor='#2C5F8A', zorder=5) ax.add_patch(seroma_hdr) ax.text(5.4, 27.45, '🔵 SEROMA (Most Common — ~19–27%)', ha='center', va='center', fontsize=11, color='white', fontweight='bold', zorder=6) infect_hdr = FancyBboxPatch((11.5, 27.0), 10.2, 0.9, boxstyle='round,pad=0.05', linewidth=0, facecolor='#8A2C2C', zorder=5) ax.add_patch(infect_hdr) ax.text(16.6, 27.45, '🔴 SURGICAL SITE INFECTION (SSI — ~5%)', ha='center', va='center', fontsize=11, color='white', fontweight='bold', zorder=6) # Vertical divider ax.plot([11, 11], [0.5, 27.0], color='#AAB8C2', lw=1.5, linestyle='--', zorder=2) # ══════════════════════════════════════════════════════════════════════════════ # ─────────────── LEFT COLUMN: SEROMA ──────────────────────────────────────── # ══════════════════════════════════════════════════════════════════════════════ # S1 – Post-op assessment box(ax, 5.4, 26.3, 9.0, 0.65, 'Post-op Assessment (Day 1 – Week 6)', C['start'], bold=True, fontsize=9.5) arrow(ax, 5.4, 25.97, 5.4, 25.45) # S2 – Swelling? diamond(ax, 5.4, 25.1, 7.0, 0.75, 'Subcutaneous swelling / fullness at surgical site?', C['decision'], fontsize=8.5) arrow(ax, 5.4, 24.72, 5.4, 24.2, label='YES') # NO branch ax.annotate('', xy=(9.9, 25.1), xytext=(8.9, 25.1), arrowprops=dict(arrowstyle='->', color=C['success'], lw=1.8)) box(ax, 10.3, 25.1, 0.7, 0.5, 'Continue\nroutine\nfollow-up', C['success'], fontsize=7) ax.text(9.4, 25.25, 'NO', fontsize=8, color=C['success'], fontweight='bold') # S3 – Clinical evaluation box(ax, 5.4, 23.85, 9.0, 0.65, 'Clinical Evaluation: Fluctuant? Tender? Erythema? Fever?', C['info'], fontsize=8.5) arrow(ax, 5.4, 23.52, 5.4, 22.9) # S4 – Signs of infection? diamond(ax, 5.4, 22.55, 7.5, 0.72, 'Erythema / Fever / Purulence / Leukocytosis?', C['warning'], fontsize=8.5) # YES → cross to infection column (handled by note) ax.annotate('', xy=(11.0, 22.55), xytext=(9.15, 22.55), arrowprops=dict(arrowstyle='->', color=C['warning'], lw=2.0, connectionstyle='arc3,rad=0.0')) ax.text(9.8, 22.72, 'YES →\nSSI path', fontsize=8, color=C['warning'], fontweight='bold', ha='center') arrow(ax, 5.4, 22.19, 5.4, 21.55, label='NO / Pure seroma') # S5 – Ultrasound box(ax, 5.4, 21.2, 9.0, 0.65, 'Ultrasound Confirmation\n(Anechoic fluid collection, no septations)', C['start'], fontsize=8.5) arrow(ax, 5.4, 20.87, 5.4, 20.25) # S6 – Size? diamond(ax, 5.4, 19.9, 7.5, 0.72, 'Collection size?\n(clinically symptomatic?)', C['decision'], fontsize=8.5) arrow(ax, 5.4, 19.54, 5.4, 18.85, label='< 5 cm / asymptomatic') # Small seroma box(ax, 5.4, 18.5, 9.0, 0.65, 'Conservative Management\n• Reassure patient • Compressive garment • Avoid strenuous activity • Review at 4–6 weeks', C['action'], fontsize=8.2) arrow(ax, 5.4, 18.17, 5.4, 17.55) # Resolved? diamond(ax, 5.4, 17.2, 7.0, 0.7, 'Resolved at 6-week review?', C['decision'], fontsize=8.5) # YES ax.annotate('', xy=(1.6, 17.2), xytext=(1.9, 17.2), arrowprops=dict(arrowstyle='->', color=C['success'], lw=1.8)) box(ax, 1.0, 17.2, 1.8, 0.5, 'Discharge /\nRoutine FU', C['success'], fontsize=7.5) ax.text(1.95, 17.38, 'YES', fontsize=8, color=C['success'], fontweight='bold') arrow(ax, 5.4, 16.85, 5.4, 16.25, label='NO / Enlarging') # Large seroma branch from S6 ax.annotate('', xy=(9.1, 18.55), xytext=(8.65, 19.54), arrowprops=dict(arrowstyle='->', color=C['warning'], lw=1.8, connectionstyle='arc3,rad=0.0')) ax.text(9.3, 19.2, '≥5 cm /\nSymptomatic', fontsize=8, color=C['warning'], fontweight='bold', ha='center') # Aspiration box(ax, 5.4, 15.9, 9.2, 0.65, 'Ultrasound-Guided Aspiration\n(Can be repeated 1–2×; send fluid for C&S if cloudy)', C['action'], fontsize=8.2) arrow(ax, 5.4, 15.57, 5.4, 14.95) diamond(ax, 5.4, 14.6, 7.5, 0.7, 'Recurs after 2 aspirations?', C['decision'], fontsize=8.5) arrow(ax, 5.4, 14.24, 5.4, 13.55, label='YES') # NO branch ax.annotate('', xy=(1.6, 14.6), xytext=(1.9, 14.6), arrowprops=dict(arrowstyle='->', color=C['success'], lw=1.8)) box(ax, 1.0, 14.6, 1.8, 0.5, 'Monitor 2–4\nweeks\nthen discharge', C['success'], fontsize=7.5) ax.text(1.95, 14.78, 'NO', fontsize=8, color=C['success'], fontweight='bold') box(ax, 5.4, 13.2, 9.2, 0.7, 'Persistent / Chronic Seroma\n• Drain insertion (closed suction) • Sclerotherapy (doxycycline / tetracycline)\n• Consider re-exploration if mesh folded / wrinkled', C['warning'], fontsize=8.0) arrow(ax, 5.4, 12.85, 5.4, 12.2) box(ax, 5.4, 11.85, 9.2, 0.65, 'Resolution? → Discharge\nNo resolution → Surgical review; consider mesh explanation if infected seroma', C['info'], fontsize=8.0) # PREVENTION BOX (seroma) prev_bg = FancyBboxPatch((0.5, 10.5), 9.8, 1.1, boxstyle='round,pad=0.1', linewidth=1.5, edgecolor=C['note_border'], facecolor=C['note_bg'], zorder=3) ax.add_patch(prev_bg) ax.text(5.4, 11.27, '⚠ SEROMA PREVENTION (intraoperative)', ha='center', va='center', fontsize=8.5, fontweight='bold', color='#7A5C00', zorder=4) ax.text(5.4, 10.85, 'Routine closed-suction drain | Fibrin glue to dead space | Minimize dissection extent\nPreserve subcutaneous lymphatics | Compressive dressing post-op', ha='center', va='center', fontsize=7.8, color='#5C4200', zorder=4, multialignment='center') # ══════════════════════════════════════════════════════════════════════════════ # ─────────────── RIGHT COLUMN: SSI ────────────────────────────────────────── # ══════════════════════════════════════════════════════════════════════════════ # I1 – Post-op assessment box(ax, 16.6, 26.3, 9.0, 0.65, 'Post-op Assessment (Day 3 – Week 6)', '#8A2C2C', bold=True, fontsize=9.5) arrow(ax, 16.6, 25.97, 16.6, 25.45) # I2 – Signs of SSI? diamond(ax, 16.6, 25.1, 8.5, 0.75, 'Wound erythema / warmth / swelling / discharge\nor fever / raised WBC / CRP?', C['warning'], fontsize=8.5) arrow(ax, 16.6, 24.72, 16.6, 24.12, label='YES') ax.annotate('', xy=(20.9, 25.1), xytext=(20.85, 25.1), arrowprops=dict(arrowstyle='->', color=C['success'], lw=1.8)) box(ax, 21.3, 25.1, 0.8, 0.5, 'Routine\nFU', C['success'], fontsize=7.5) ax.text(20.65, 25.28, 'NO', fontsize=8, color=C['success'], fontweight='bold') # I3 – Classify box(ax, 16.6, 23.75, 9.2, 0.72, 'CLASSIFY SSI (CDC Criteria)\n▸ Superficial ▸ Deep ▸ Organ/Space (mesh involved?)', '#8A2C2C', fontsize=8.5) arrow(ax, 16.6, 23.39, 16.6, 22.75) # I4 – Superficial vs Deep diamond(ax, 16.6, 22.4, 8.5, 0.72, 'Deep SSI / Mesh involvement suspected?', C['decision'], fontsize=8.5) # NO – superficial branch arrow(ax, 12.35, 22.4, 11.8, 22.4) # left arrow to superficial box ax.text(12.4, 22.55, 'NO (Superficial)', fontsize=8, color='#27AE60', fontweight='bold') # YES – deep branch arrow(ax, 16.6, 22.04, 16.6, 21.4, label='YES (Deep)') # Superficial box box(ax, 13.3, 21.4, 3.8, 1.3, 'SUPERFICIAL SSI\n─────────────\n• Wound swab for C&S\n• Empiric PO antibiotics\n (Co-amoxiclav / Cefalexin)\n• Wound opening if fluctuant\n• Warm saline irrigation\n• Dressing changes\n• Review 48–72 h', C['action'], fontsize=8.0) # Deep SSI box(ax, 18.6, 21.0, 5.8, 1.1, 'DEEP SSI Workup\n• Blood cultures + wound swab\n• CT abdomen/pelvis\n (gas, fluid collection, mesh integrity)\n• IV antibiotics (empiric broad-spectrum)', C['warning'], fontsize=8.0) arrow(ax, 18.6, 20.45, 18.6, 19.85) diamond(ax, 18.6, 19.5, 6.0, 0.72, 'CT: Peri-mesh collection /\nMesh contamination?', C['decision'], fontsize=8.5) # NO → medical management ax.annotate('', xy=(14.8, 19.5), xytext=(15.6, 19.5), arrowprops=dict(arrowstyle='->', color=C['action'], lw=1.8)) ax.text(15.1, 19.65, 'NO', fontsize=8, color=C['action'], fontweight='bold') box(ax, 13.9, 19.5, 2.4, 0.9, 'Continue IV Abx\n48–72 h, then\nstep-down PO\nReview 1 week', C['action'], fontsize=7.8) # YES → surgical arrow(ax, 18.6, 19.14, 18.6, 18.45, label='YES') box(ax, 18.6, 18.1, 5.8, 0.7, 'CT-guided or Surgical Drainage\n• Percutaneous drain if accessible\n• IV Abx: Pip-Tazo / Meropenem guided by cultures', C['warning'], fontsize=8.0) arrow(ax, 18.6, 17.75, 18.6, 17.1) diamond(ax, 18.6, 16.75, 6.2, 0.72, 'Response to drainage + Abx\n(72 h reassessment)?', C['decision'], fontsize=8.5) # YES → recover ax.annotate('', xy=(14.6, 16.75), xytext=(15.5, 16.75), arrowprops=dict(arrowstyle='->', color=C['success'], lw=1.8)) ax.text(15.1, 16.92, 'YES', fontsize=8, color=C['success'], fontweight='bold') box(ax, 13.9, 16.75, 2.4, 0.9, 'Complete Abx course\n(4–6 weeks if mesh)\nRegular wound review\nImagine at 3 months', C['success'], fontsize=7.5) # NO → explant decision arrow(ax, 18.6, 16.39, 18.6, 15.7, label='NO / Worsening') box(ax, 18.6, 15.35, 6.2, 0.7, '⚠ MESH EXPLANTATION DECISION\nMultidisciplinary discussion (surgeon + ID + radiologist)', C['warning'], bold=True, fontsize=8.2) arrow(ax, 18.6, 15.0, 18.6, 14.35) diamond(ax, 18.6, 14.0, 6.5, 0.72, 'Mesh salvage possible?\n(Early infection, clean tissue, controlled)', C['decision'], fontsize=8.5) arrow(ax, 18.6, 13.64, 18.6, 12.95, label='NO') ax.annotate('', xy=(21.95, 14.0), xytext=(21.85, 14.0), arrowprops=dict(arrowstyle='->', color=C['action'], lw=1.8)) ax.text(21.7, 14.18, 'YES', fontsize=8, color=C['action'], fontweight='bold') box(ax, 21.5, 13.5, 0.9, 1.0, 'Aggressive\nwound wash-\nout, NPWT,\nDelayed\nprimary\nclosure', C['action'], fontsize=7.0) box(ax, 18.6, 12.6, 6.5, 0.7, 'MESH EXPLANTATION\n• Remove mesh • Debride infected tissue\n• NPWT (Vacuum therapy) • Plan delayed repair at 3–6 months', C['warning'], fontsize=8.0) arrow(ax, 18.6, 12.25, 18.6, 11.6) box(ax, 18.6, 11.25, 6.5, 0.7, 'Post-explantation Care\n• Culture-directed Abx • Wound healing by secondary intention or flap\n• Nutritional support • Delayed ventral hernia re-repair', C['info'], fontsize=7.8) # PREVENTION BOX (SSI) prev_ssi = FancyBboxPatch((11.5, 10.5), 9.8, 1.1, boxstyle='round,pad=0.1', linewidth=1.5, edgecolor='#C0392B', facecolor='#FFF0F0', zorder=3) ax.add_patch(prev_ssi) ax.text(16.4, 11.27, '⚠ SSI PREVENTION (peri-operative)', ha='center', va='center', fontsize=8.5, fontweight='bold', color='#7A0000', zorder=4) ax.text(16.4, 10.85, 'Pre-op antibiotics (30 min before) | Skin antisepsis (chlorhexidine) | Avoid mesh-skin contact\nMinimize OR time | Normoglycemia | SCOLA mesh: non-coated PP (lower SSI vs IPOM barrier mesh)', ha='center', va='center', fontsize=7.5, color='#5C0000', zorder=4, multialignment='center') # ══════════════════════════════════════════════════════════════════════════════ # LEGEND # ══════════════════════════════════════════════════════════════════════════════ legend_bg = FancyBboxPatch((0.3, 9.3), 21.4, 0.9, boxstyle='round,pad=0.05', linewidth=1, edgecolor='#AAB8C2', facecolor='#EEF2F7', zorder=3) ax.add_patch(legend_bg) ax.text(11, 9.95, 'LEGEND', ha='center', va='center', fontsize=9, fontweight='bold', color='#2C3E50') legend_items = [ (1.5, 9.6, C['start'], 'Start / Assessment'), (5.5, 9.6, C['decision'], 'Decision / Branch'), (9.5, 9.6, C['action'], 'Action / Treatment'), (13.5, 9.6, C['warning'], 'Critical / Escalation'), (17.5, 9.6, C['success'], 'Resolution / Discharge'), (20.8, 9.6, C['info'], 'Investigation'), ] for lx, ly, lc, lt in legend_items: b = FancyBboxPatch((lx-0.5, ly-0.2), 1.0, 0.38, boxstyle='round,pad=0.05', facecolor=lc, edgecolor='none', zorder=4) ax.add_patch(b) ax.text(lx, ly-0.48, lt, ha='center', va='top', fontsize=7, color='#2C3E50', zorder=5) # ══════════════════════════════════════════════════════════════════════════════ # CROSS-REFERENCE ARROW (seroma → SSI) # ══════════════════════════════════════════════════════════════════════════════ ax.annotate('', xy=(11.4, 22.55), xytext=(9.15, 22.55), arrowprops=dict(arrowstyle='->', color=C['warning'], lw=2.2, linestyle='dashed')) ax.text(10.3, 22.72, 'Refer to\nSSI path →', fontsize=7.5, color=C['warning'], fontweight='bold', ha='center') # Footer ax.text(11, 8.85, 'Based on: Vitiello et al. 2026 (SR/Meta-analysis, PMID 41667727) | Deshpande et al. 2024 (PMID 39730131) | Sabiston Textbook of Surgery | Mulholland & Greenfield Surgery 7e', ha='center', va='center', fontsize=7, color='#7F8C8D') plt.tight_layout(pad=0.5) plt.savefig('/tmp/workspace/scola-flowchart/SCOLA_Complication_Flowchart.png', dpi=180, bbox_inches='tight', facecolor='#F0F4F8') plt.close() print("Saved successfully.") PYEOF