Patient 32 yr old male C/o Pain in abdomen since 1 day Periumbilical No red flag Constant No association

Reading File
Finding Sources
Finding Sources
Reading File
Finding Sources
Reading File
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Reading File
Here is a structured clinical approach to this patient:

Periumbilical Pain - 32M, 1 Day, No Red Flags

Differential Diagnosis

Periumbilical pain is a localizing clue. The visceral nerve supply of midgut structures (small bowel, appendix, proximal colon) refers pain to the periumbilical region before parietal peritoneum is involved. The key differentials, stratified by priority:

Must Not Miss

ConditionWhy it's periumbilicalKey clue to look for
Early AppendicitisVisceral pain from the appendix (T10 dermatome) starts periumbilical, migrates to RIF over 12-24hAnorexia, pain migration, fever, RIF tenderness
Early SBO (Small Bowel Obstruction)Midgut distension causes colicky periumbilical painPrior surgery, hernia, absolute constipation/no flatus, distension, borborygmi
Mesenteric IschemiaMidgut ischemia causes periumbilical pain "out of proportion to exam"AF, vascular disease, severe pain but soft abdomen

Active Alternatives

ConditionNotes
GastroenteritisOften periumbilical/diffuse; usually with nausea/vomiting/diarrhea
Mesenteric AdenitisLymph node inflammation (often post-viral); mimics appendicitis, mainly in young adults
Early Crohn's diseaseTerminal ileum involvement can present in this age group
Peptic ulcer / DuodenitisUpper GI irritation can refer to periumbilical region
Renal colicColicky pain, may radiate periumbilically; check for haematuria
DKACan cause diffuse/periumbilical pain; check glucose in new presentations
Hernia (incarcerated)Always check inguinal/umbilical region

Less Likely (no red flags noted)

  • Bowel malignancy, AAA (unlikely at 32), IBD flare

History to Clarify (SOCRATES + Directed)

These are pivotal questions that will narrow the differential:
  1. Pain migration? - Has the pain moved to the right lower quadrant? (Appendicitis hallmark - migration in 12-24h, per Harrison's Principles, p.2638)
  2. Anorexia? - Present in >70% of appendicitis; absence should make you question the diagnosis
  3. Nausea/vomiting? - In appendicitis, nausea follows pain onset; if nausea came first, think gastroenteritis
  4. Bowel habit? - Constipation/no flatus → obstruction; diarrhea → gastroenteritis/IBD
  5. Fever? - Even subjective fever is relevant
  6. Prior similar episodes? - Suggests functional cause or Crohn's
  7. Last meal/oral intake?
  8. Urinary symptoms? - Dysuria, haematuria → renal colic or UTI
  9. Prior abdominal surgeries or hernias? - SBO risk
  10. Character of pain - Colicky (obstruction, renal colic) vs. constant (inflammatory, ischemic)

Examination

  • Vitals - fever, HR, BP (orthostatic if suspect hypovolaemia)
  • Abdomen:
    • Inspection - distension, visible peristalsis, scars
    • Auscultation - borborygmi (obstruction), absent sounds (ileus/ischemia)
    • Palpation - RIF tenderness (McBurney's point), rebound, guarding, rigidity
    • Rovsing's sign - LLQ pressure causing RLQ pain → appendicitis
    • Psoas sign - pain on right hip extension → retrocecal appendicitis
    • Obturator sign - pain on right hip internal rotation → pelvic appendix
  • Hernial orifices - inguinal, femoral, umbilical
  • PR exam - not routinely indicated for appendicitis diagnosis but may reveal other pathology

Investigations

First line:
  • FBC - Leukocytosis (WBC elevated in appendicitis, though not specific). WBC + CRP combined sensitivity up to 98% if both normal makes appendicitis very unlikely
  • CRP - Elevated; normal values with low pretest probability effectively rules out appendicitis
  • Urine dipstick + microscopy - Rule out UTI, renal colic (haematuria), and check glucose/ketones (DKA)
  • Blood glucose - Exclude DKA
  • Urine/serum hCG - Not indicated in a male, but worth noting in females
Imaging:
  • Ultrasound abdomen - First-line imaging, especially in lean young adults; looks for appendix diameter >6 mm (non-compressible = appendicitis), free fluid, lymphadenopathy (mesenteric adenitis), hernias
  • CT abdomen/pelvis (with contrast) - Gold standard if USS equivocal or clinical suspicion remains high; highest sensitivity/specificity for appendicitis and SBO
  • Plain X-ray (erect + supine) - Low sensitivity but can show free air (perforation), air-fluid levels (obstruction) rapidly

Scoring - Modified Alvarado Score

Useful bedside tool if appendicitis is suspected (Tintinalli's Emergency Medicine):
FeaturePoints
Migration of pain to RIF1
Anorexia1
Nausea/vomiting1
RIF tenderness2
Rebound tenderness1
Elevated temperature (>37.3°C)1
Leukocytosis (WBC >10)2
Total/9
  • Score ≤4: Low probability - discharge/observe
  • Score 5-6: Moderate - observe, imaging, surgical review
  • Score ≥7: High probability - surgical consult

Initial Management

  1. Nil by mouth pending surgical evaluation if appendicitis/SBO is suspected
  2. IV access + fluid resuscitation if clinically dehydrated
  3. Analgesia - IV paracetamol or titrated opioids; do NOT withhold analgesia (does not mask signs)
  4. Surgical consultation early if Alvarado score ≥5 or clinical picture concerning
  5. Serial abdominal exams if observation is chosen - pain migration or worsening mandates reassessment

Bottom line for this patient: A 32-year-old male with 1 day of periumbilical pain and no red flags most likely has early appendicitis, gastroenteritis, or mesenteric adenitis. Appendicitis must be actively excluded - ask specifically about pain migration to the RIF, anorexia, fever, and obtain FBC, CRP, and urinalysis as a minimum. If suspicion is moderate-high, get surgical consultation and USS/CT before deciding management.
  • Tintinalli's Emergency Medicine, p.357-441
  • Harrison's Principles of Internal Medicine 22E, p.2638-2640
  • Symptom to Diagnosis: An Evidence Based Guide, 4th Ed, p.56
attachment
attachment

Make like this

Reading File
Running Command

mkdir -p /tmp/workspace/case-cards && ls /tmp/workspace/case-cards/

Writing File

~/case-cards/generate_card.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, HRFlowable, Table, TableStyle
)
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_CENTER
from reportlab.platypus import KeepTogether

OUTPUT = "/tmp/workspace/case-cards/case_periumbilical_pain.pdf"

# ── Colour palette (matching reference image) ──────────────────────────────
TEAL      = colors.HexColor("#2E7D87")   # section headers
DARK_NAVY = colors.HexColor("#1B2A4A")   # body text / Rx numbers
ORANGE    = colors.HexColor("#D97B2B")   # dosage highlights
RED       = colors.HexColor("#C0392B")   # complications
LIGHT_BG  = colors.HexColor("#EAF4F6")   # title box background
BORDER    = colors.HexColor("#2E7D87")   # title box border
GREY_TEXT = colors.HexColor("#888888")   # disclaimer

# ── Styles ──────────────────────────────────────────────────────────────────
def S(name, **kw):
    base = dict(fontName="Helvetica", fontSize=10, leading=15,
                textColor=DARK_NAVY, spaceAfter=2)
    base.update(kw)
    return ParagraphStyle(name, **base)

s_title     = S("title",   fontName="Helvetica-Bold", fontSize=14,
                textColor=DARK_NAVY, alignment=TA_CENTER, leading=20)
s_section   = S("section", fontName="Helvetica-Bold", fontSize=11,
                textColor=TEAL, spaceAfter=2, spaceBefore=6)
s_body      = S("body",    fontSize=10, leading=15)
s_bullet    = S("bullet",  fontSize=10, leading=15, leftIndent=14,
                bulletIndent=4)
s_italic    = S("italic",  fontName="Helvetica-Oblique", fontSize=10.5,
                textColor=DARK_NAVY, leftIndent=10, leading=16)
s_rx_num    = S("rxnum",   fontSize=10, leading=16, leftIndent=6)
s_rta       = S("rta",     fontName="Helvetica-Bold", fontSize=11,
                textColor=ORANGE, alignment=TA_CENTER, spaceAfter=4)
s_comp      = S("comp",    fontSize=10, leading=15, textColor=RED,
                leftIndent=14, bulletIndent=4)
s_disclaim  = S("disclaim",fontSize=7.5, textColor=GREY_TEXT,
                alignment=TA_CENTER, leading=11)

def bullet(text, style=s_bullet):
    return Paragraph(f"•  {text}", style)

def rx_line(num, tab_text, dose_text, rest_text):
    """Returns a Paragraph with mixed bold/coloured text for an Rx line."""
    html = (f'<font color="{ORANGE.hexval()}"><b>{num})</b></font>'
            f'<b>Tab.</b> {tab_text} '
            f'<font color="{ORANGE.hexval()}"><b>{dose_text}</b></font>'
            f'{rest_text}')
    return Paragraph(html, s_rx_num)

def rx_plain(num, text):
    html = f'<font color="{ORANGE.hexval()}"><b>{num})</b></font>{text}'
    return Paragraph(html, s_rx_num)

# ── Build story ─────────────────────────────────────────────────────────────
story = []

# ── Title box ────────────────────────────────────────────────────────────────
title_para = Paragraph("CASE: PERIUMBILICAL ABDOMINAL PAIN", s_title)
title_tbl  = Table([[title_para]], colWidths=[155*mm])
title_tbl.setStyle(TableStyle([
    ("BACKGROUND",  (0,0), (-1,-1), LIGHT_BG),
    ("BOX",         (0,0), (-1,-1), 1.5, BORDER),
    ("ROUNDEDCORNERS", [6]),
    ("TOPPADDING",  (0,0), (-1,-1), 10),
    ("BOTTOMPADDING",(0,0),(-1,-1), 10),
    ("LEFTPADDING", (0,0), (-1,-1), 10),
    ("RIGHTPADDING",(0,0), (-1,-1), 10),
]))
story.append(title_tbl)
story.append(Spacer(1, 8*mm))

# ── C/o ──────────────────────────────────────────────────────────────────────
story.append(Paragraph("C/o:-", s_section))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.lightgrey))
story.append(Spacer(1, 2*mm))
for item in [
    "Pain in abdomen since 1 day",
    "Periumbilical in location",
    "Constant in nature",
    "No red flag symptoms",
    "No associated symptoms",
]:
    story.append(bullet(item))
story.append(Spacer(1, 4*mm))

# ── Most probable diagnosis ──────────────────────────────────────────────────
story.append(Paragraph("Most probable diagnosis:", s_section))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.lightgrey))
story.append(Spacer(1, 2*mm))
story.append(Paragraph(
    "Early Appendicitis / Mesenteric Adenitis / Acute Gastroenteritis",
    s_italic))
story.append(Spacer(1, 5*mm))

# ── Advice + Rx (two-column table) ──────────────────────────────────────────
advice_items = [
    bullet("CBC"),
    bullet("CRP / ESR"),
    bullet("Urine R/M"),
    bullet("USG Abdomen"),
    bullet("Alvarado Score"),
    bullet("Surgical Consult if score ≥ 5"),
]

rx_items = [
    Paragraph("<b>Rx</b>", S("rxhead", fontName="Helvetica-Bold",
              fontSize=13, textColor=DARK_NAVY)),
    rx_line("1", "PCM ", "650mg", " x TDS (after food)"),
    rx_line("2", "Pan ", "40mg", " x OD (before food)"),
    rx_line("3", "Domperidone ", "10mg", " x TDS (before food)"),
    rx_plain("4",
        " <b>IV Fluids</b> (if dehydrated / vomiting) — "
        f'<font color="{ORANGE.hexval()}"><b>NS / RL @ 100 ml/hr</b></font>'),
    rx_plain("5",
        " Analgesic if needed: <b>Inj.</b> "
        f'<font color="{ORANGE.hexval()}"><b>Tramadol 50mg</b></font>'
        " slow IV"),
    rx_plain("6", " <b>NPO</b> if surgical cause suspected"),
    rx_plain("7", " Rest + Oral hydration (ORS) if tolerating orally"),
    Spacer(1, 4*mm),
    Paragraph(
        f'<font color="{ORANGE.hexval()}"><b>R/A 24-48 hours</b></font>'
        " (or earlier if pain migrates to RIF / worsens)",
        S("rta2", fontName="Helvetica-Bold", fontSize=10,
          textColor=ORANGE, alignment=TA_CENTER)),
]

col_advice = [advice_items]  # single column
# Build left column as a mini table
adv_inner = [[a] for a in advice_items]
adv_tbl = Table(adv_inner, colWidths=[60*mm])
adv_tbl.setStyle(TableStyle([
    ("TOPPADDING",   (0,0),(-1,-1), 2),
    ("BOTTOMPADDING",(0,0),(-1,-1), 2),
    ("LEFTPADDING",  (0,0),(-1,-1), 0),
    ("RIGHTPADDING", (0,0),(-1,-1), 0),
]))

rx_inner = [[r] for r in rx_items]
rx_tbl = Table(rx_inner, colWidths=[90*mm])
rx_tbl.setStyle(TableStyle([
    ("TOPPADDING",   (0,0),(-1,-1), 2),
    ("BOTTOMPADDING",(0,0),(-1,-1), 2),
    ("LEFTPADDING",  (0,0),(-1,-1), 2),
    ("RIGHTPADDING", (0,0),(-1,-1), 0),
]))

left_header  = Paragraph("Advice:", S("advhdr", fontName="Helvetica-Bold",
                          fontSize=11, textColor=TEAL))
right_header = Paragraph("", s_body)

two_col = Table(
    [[left_header, right_header],
     [adv_tbl,     rx_tbl]],
    colWidths=[62*mm, 93*mm]
)
two_col.setStyle(TableStyle([
    ("VALIGN",       (0,0),(-1,-1), "TOP"),
    ("TOPPADDING",   (0,0),(-1,-1), 3),
    ("BOTTOMPADDING",(0,0),(-1,-1), 3),
    ("LEFTPADDING",  (0,0),(-1,-1), 0),
    ("RIGHTPADDING", (0,0),(-1,-1), 0),
    ("LINEABOVE",    (0,0),(-1,0),  0.5, colors.lightgrey),
]))
story.append(two_col)
story.append(Spacer(1, 6*mm))

# ── Complications ─────────────────────────────────────────────────────────────
story.append(Paragraph("Complications:", S("comphdr",
    fontName="Helvetica-Bold", fontSize=11, textColor=RED,
    decoration="underline")))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.lightgrey))
story.append(Spacer(1, 2*mm))
for item in [
    "Perforation peritonitis (if appendicitis missed)",
    "Bowel obstruction / strangulation",
    "Sepsis / septic shock",
    "Drug-induced gastritis (NSAIDs)",
    "Missed surgical emergency",
]:
    story.append(bullet(item, style=s_comp))
story.append(Spacer(1, 8*mm))

# ── Disclaimer ───────────────────────────────────────────────────────────────
story.append(HRFlowable(width="100%", thickness=0.4, color=colors.lightgrey))
story.append(Spacer(1, 2*mm))
story.append(Paragraph(
    "Disclaimer: This handbook is intended as a clinical reference guide "
    "and does not replace clinical judgment. For educational purposes only.",
    s_disclaim))

# ── Render ───────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
    OUTPUT, pagesize=A4,
    leftMargin=20*mm, rightMargin=20*mm,
    topMargin=20*mm, bottomMargin=20*mm,
)
doc.build(story)
print("PDF saved to", OUTPUT)
Running Command

cd /tmp/workspace/case-cards && python generate_card.py 2>&1

Your clinical case card is ready, styled exactly like the reference image:

case periumbilical pain

PDF Document · PDF

What's included (matching the reference format):
  • Title box - light blue background with teal border
  • C/o section - teal bold header with bullet points
  • Most probable diagnosis - italicised text (Early Appendicitis / Mesenteric Adenitis / Acute Gastroenteritis)
  • Two-column Advice + Rx layout - investigations on the left, numbered prescriptions on the right with orange dose highlights and bold "Tab."
  • R/A 24-48 hours - orange bold centered
  • Complications - red underlined header with red bullet points
  • Disclaimer - small grey text at the bottom

Why not drotaverine

Good clinical question. Here's the reasoning:

Why Drotaverine is NOT ideal here

Drotaverine is a smooth muscle antispasmodic (PDE4 inhibitor). It works by relaxing smooth muscle in hollow viscera - intestine, bile duct, ureter.

The core problem: it masks the diagnosis

This patient has periumbilical pain of 1 day with an unknown cause. The single most important differential to exclude is early appendicitis.
Risk with DrotaverineExplanation
Masks pain migrationAppendicitis classically migrates to RIF over 12-24h. Antispasmodics can blunt this critical diagnostic sign
Reduces guarding/tendernessSmooth muscle relaxation softens the abdominal wall response, making clinical examination unreliable
Delays surgical referralPatient feels better temporarily → comes back late with perforated appendicitis
False reassurancePain relief ≠ resolution of pathology

When IS drotaverine appropriate?

Drotaverine is correct and useful when the cause is confirmed spasmodic/colic:
  • Renal/ureteric colic (confirmed on urine + USG)
  • Biliary colic (confirmed on USG)
  • IBS with spasm (after surgical cause excluded)
  • Dysmenorrhoea

The surgical rule

In any undiagnosed abdominal pain, do not give antispasmodics or analgesics that mask peritoneal signs until a surgical emergency has been excluded.
This is why the Rx in the card uses PCM (safe, does not mask peritoneal signs significantly) rather than antispasmodics or NSAIDs as first-line, and keeps the patient under observation.
Bottom line: Once USG abdomen and clinical exam confirm no surgical pathology and the pain is confirmed to be functional/spasmodic - drotaverine is entirely appropriate to add. But not before.
This is a shared conversation. Sign in to Orris to start your own chat.