Hello
I am an Ent surgeon
| Diagnosis | Favoring features |
|---|---|
| Pyogenic granuloma (lobular capillary hemangioma) | Lobulated, friable, bleeds easily, alar location common |
| Vascular malformation (venous/arteriovenous) | Engorged, tense, dark-red discoloration |
| Nasal vestibule furuncle/abscess | Tense, inflamed alar region |
| Kaposi sarcoma | Purplish vascular lesion (less likely without context) |
I got a patient with unilateral snhl for 1 yr
"Any patient with unilateral SNHL and/or unilateral tinnitus, with or without balance disturbance, should be suspected of having a vestibular schwannoma."
- Shambaugh Surgery of the Ear
"It is essential to perform MRI on all patients with persistent unilateral SNHL or tinnitus."
- Bailey & Love's Surgery
| Investigation | Purpose |
|---|---|
| Pure Tone Audiogram + Speech Discrimination | Quantify loss, note pattern |
| Tympanometry + Stapedial reflexes | Absent ipsilateral reflex suggests retrocochlear pathology |
| ABR (BERA) | Retrocochlear screening - prolonged I-V interpeak latency |
| Gadolinium-enhanced MRI IAC/CPA | Gold standard - most sensitive for vestibular schwannoma |
| VEMP (cervical + ocular) | Saccular/utricular function, aids tumor localization |
| Caloric testing / Video HIT | Vestibular hypofunction on affected side |
| Cause | Features |
|---|---|
| Vestibular schwannoma | Gradual progressive, tinnitus, mild imbalance |
| Sudden SNHL (resolved/residual) | Acute onset, may have preceding viral illness |
| Meniere's disease | Episodic vertigo, fluctuating hearing, low-frequency loss |
| Autoimmune inner ear disease | Bilateral eventually, responds to steroids |
| CPA meningioma / epidermoid | MRI differentiates |
| Endolymphatic sac tumor | Progressive unilateral SNHL + tinnitus |
| Syphilis / Lyme | Serology, systemic features |
| Labyrinthitis (viral/bacterial) | Acute onset, often with vertigo |
| NF2 | Bilateral, family history |
| Superior semicircular canal dehiscence | Autophony, low frequency air-bone gap |
Can u give me some template for my work in opd
ls /home/daytona/workspace/ && mkdir -p /home/daytona/workspace/ent-opd-template
~/ent-opd-template/create_template.js
const {
Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell,
AlignmentType, HeadingLevel, BorderStyle, WidthType, VerticalAlign,
ShadingType, Header, PageNumber, NumberFormat, UnderlineType
} = require('docx');
const fs = require('fs');
// Helper: section heading paragraph
function sectionHeading(text) {
return new Paragraph({
children: [new TextRun({ text, bold: true, size: 24, color: '1F4E79' })],
spacing: { before: 200, after: 80 },
border: {
bottom: { style: BorderStyle.SINGLE, size: 6, color: '1F4E79' }
}
});
}
// Helper: label + blank line row (single-column fill-in)
function fillLine(label, width = 9000) {
return new Paragraph({
children: [
new TextRun({ text: label + ' ', bold: true, size: 20 }),
new TextRun({ text: '_'.repeat(60), size: 20, color: 'AAAAAA' })
],
spacing: { before: 60, after: 60 }
});
}
// Helper: two-column fill row
function twoColFill(label1, label2) {
return new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
borders: {
top: { style: BorderStyle.NONE }, bottom: { style: BorderStyle.NONE },
left: { style: BorderStyle.NONE }, right: { style: BorderStyle.NONE },
insideH: { style: BorderStyle.NONE }, insideV: { style: BorderStyle.NONE }
},
rows: [new TableRow({
children: [
new TableCell({
width: { size: 50, type: WidthType.PERCENTAGE },
borders: { top: { style: BorderStyle.NONE }, bottom: { style: BorderStyle.NONE }, left: { style: BorderStyle.NONE }, right: { style: BorderStyle.NONE } },
children: [new Paragraph({
children: [
new TextRun({ text: label1 + ' ', bold: true, size: 20 }),
new TextRun({ text: '_'.repeat(30), size: 20, color: 'AAAAAA' })
], spacing: { before: 60, after: 60 }
})]
}),
new TableCell({
width: { size: 50, type: WidthType.PERCENTAGE },
borders: { top: { style: BorderStyle.NONE }, bottom: { style: BorderStyle.NONE }, left: { style: BorderStyle.NONE }, right: { style: BorderStyle.NONE } },
children: [new Paragraph({
children: [
new TextRun({ text: label2 + ' ', bold: true, size: 20 }),
new TextRun({ text: '_'.repeat(30), size: 20, color: 'AAAAAA' })
], spacing: { before: 60, after: 60 }
})]
})
]
})]
});
}
// Helper: checkbox row
function checkboxRow(items) {
const runs = [];
items.forEach((item, i) => {
runs.push(new TextRun({ text: '☐ ' + item + ' ', size: 20 }));
});
return new Paragraph({ children: runs, spacing: { before: 60, after: 60 } });
}
// Helper: titled checkbox group
function checkboxGroup(label, items) {
return [
new Paragraph({
children: [new TextRun({ text: label, bold: true, size: 20 })],
spacing: { before: 80, after: 40 }
}),
checkboxRow(items)
];
}
// Helper: empty line
function emptyLine() {
return new Paragraph({ text: '', spacing: { before: 40, after: 40 } });
}
// ─── DOCUMENT ─────────────────────────────────────────────────────────────────
const doc = new Document({
styles: {
default: {
document: {
run: { font: 'Calibri', size: 20 }
}
}
},
sections: [{
properties: {
page: {
margin: { top: 720, bottom: 720, left: 900, right: 900 }
}
},
headers: {
default: new Header({
children: [new Paragraph({
children: [
new TextRun({ text: 'ENT OPD CONSULTATION PROFORMA', bold: true, size: 28, color: '1F4E79' })
],
alignment: AlignmentType.CENTER,
border: { bottom: { style: BorderStyle.THICK, size: 8, color: '1F4E79' } },
spacing: { after: 100 }
})]
})
},
children: [
// ── PATIENT DETAILS ─────────────────────────────────────────────────────
sectionHeading('PATIENT DETAILS'),
twoColFill('Name:', 'Date:'),
twoColFill('Age:', 'Sex: ☐ M ☐ F ☐ Other'),
twoColFill('OP No.:', 'Referred by:'),
fillLine('Address / Contact:'),
emptyLine(),
// ── CHIEF COMPLAINT ─────────────────────────────────────────────────────
sectionHeading('CHIEF COMPLAINT'),
fillLine('Chief Complaint:'),
fillLine('Duration:'),
emptyLine(),
// ── EAR SYMPTOMS ────────────────────────────────────────────────────────
sectionHeading('EAR SYMPTOMS'),
...checkboxGroup('Hearing:', ['Normal', 'Decreased - Right', 'Decreased - Left', 'Bilateral decrease', 'Sudden onset', 'Gradual onset', 'Fluctuating']),
...checkboxGroup('Type of Loss (if known):', ['Conductive', 'Sensorineural', 'Mixed']),
...checkboxGroup('Tinnitus:', ['Absent', 'Right', 'Left', 'Bilateral', 'Pulsatile', 'Non-pulsatile']),
...checkboxGroup('Vertigo / Dizziness:', ['Absent', 'Episodic vertigo', 'Constant imbalance', 'BPPV-type', 'With nausea/vomiting']),
...checkboxGroup('Ear Discharge:', ['Absent', 'Right', 'Left', 'Bilateral', 'Purulent', 'Mucoid', 'Blood-stained', 'Foul-smelling']),
...checkboxGroup('Otalgia:', ['Absent', 'Right', 'Left', 'Constant', 'Intermittent']),
...checkboxGroup('Aural Fullness:', ['Absent', 'Right', 'Left']),
fillLine('Other Ear Symptoms:'),
emptyLine(),
// ── NOSE & SINUS SYMPTOMS ───────────────────────────────────────────────
sectionHeading('NOSE & SINUS SYMPTOMS'),
...checkboxGroup('Nasal Obstruction:', ['Absent', 'Right', 'Left', 'Bilateral', 'Constant', 'Intermittent']),
...checkboxGroup('Rhinorrhoea:', ['Absent', 'Watery', 'Mucoid', 'Mucopurulent', 'Blood-stained', 'Unilateral', 'Bilateral']),
...checkboxGroup('Epistaxis:', ['Absent', 'Right', 'Left', 'Bilateral', 'Recurrent']),
...checkboxGroup('Smell:', ['Normal', 'Hyposmia', 'Anosmia', 'Parosmia']),
...checkboxGroup('Sneezing / Allergy:', ['Absent', 'Sneezing', 'Itching', 'Watery eyes', 'Seasonal', 'Perennial']),
...checkboxGroup('Facial Pain / Headache:', ['Absent', 'Frontal', 'Maxillary', 'Ethmoidal', 'Occipital', 'Post-nasal drip']),
emptyLine(),
// ── THROAT / ORAL SYMPTOMS ──────────────────────────────────────────────
sectionHeading('THROAT & ORAL SYMPTOMS'),
...checkboxGroup('Sore Throat:', ['Absent', 'Acute', 'Recurrent', 'Chronic']),
...checkboxGroup('Dysphagia:', ['Absent', 'Solids', 'Liquids', 'Both']),
...checkboxGroup('Voice Change:', ['Absent', 'Hoarseness', 'Dysphonia', 'Aphonia', 'Nasal voice', 'Weak voice']),
...checkboxGroup('Stridor:', ['Absent', 'Inspiratory', 'Expiratory', 'Biphasic']),
...checkboxGroup('Neck Swelling:', ['Absent', 'Midline', 'Right', 'Left', 'Bilateral', 'Painful', 'Painless']),
...checkboxGroup('Snoring / Sleep Apnoea:', ['Absent', 'Snoring', 'Witnessed apnoeas', 'Daytime somnolence', 'OSA diagnosed']),
fillLine('Other Throat Symptoms:'),
emptyLine(),
// ── PAST HISTORY ────────────────────────────────────────────────────────
sectionHeading('PAST HISTORY'),
...checkboxGroup('Previous ENT Surgery:', ['None', 'Myringoplasty', 'Tympanoplasty', 'Mastoidectomy', 'FESS', 'Septoplasty', 'Tonsillectomy', 'Adenoidectomy', 'Laryngoscopy', 'Other']),
fillLine('Other Surgery:'),
fillLine('Medical History (DM / HTN / Thyroid / Autoimmune / Other):'),
...checkboxGroup('Medications:', ['None', 'Ototoxic drugs (aminoglycosides, loop diuretics, cisplatin)', 'Anticoagulants', 'NSAIDs', 'Other']),
fillLine('Allergies:'),
emptyLine(),
// ── SOCIAL HISTORY ──────────────────────────────────────────────────────
sectionHeading('SOCIAL HISTORY'),
...checkboxGroup('Noise Exposure:', ['None', 'Occupational', 'Recreational (music/firearms)']),
...checkboxGroup('Smoking:', ['Non-smoker', 'Ex-smoker', 'Current smoker']),
...checkboxGroup('Alcohol:', ['None', 'Occasional', 'Regular']),
twoColFill('Occupation:', 'Family History (ENT / NF2):'),
emptyLine(),
// ── GENERAL EXAMINATION ─────────────────────────────────────────────────
sectionHeading('GENERAL EXAMINATION'),
twoColFill('Built / Nourishment:', 'Pallor / Icterus / Clubbing:'),
twoColFill('Pulse:', 'BP:'),
twoColFill('Temp:', 'SpO2:'),
fillLine('LN (cervical / submandibular / parotid):'),
emptyLine(),
// ── EAR EXAMINATION ─────────────────────────────────────────────────────
sectionHeading('EAR EXAMINATION'),
new Paragraph({
children: [new TextRun({ text: 'Otoscopy', bold: true, size: 22, underline: { type: UnderlineType.SINGLE } })],
spacing: { before: 100, after: 60 }
}),
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
rows: [
new TableRow({
tableHeader: true,
children: [
new TableCell({ children: [new Paragraph({ children: [new TextRun({ text: 'Finding', bold: true, size: 20 })], alignment: AlignmentType.CENTER })], shading: { type: ShadingType.CLEAR, fill: 'BDD7EE' } }),
new TableCell({ children: [new Paragraph({ children: [new TextRun({ text: 'RIGHT EAR', bold: true, size: 20 })], alignment: AlignmentType.CENTER })], shading: { type: ShadingType.CLEAR, fill: 'BDD7EE' } }),
new TableCell({ children: [new Paragraph({ children: [new TextRun({ text: 'LEFT EAR', bold: true, size: 20 })], alignment: AlignmentType.CENTER })], shading: { type: ShadingType.CLEAR, fill: 'BDD7EE' } })
]
}),
...['Pinna / Tragus / Post-auricular', 'EAC (Meatus)', 'Tympanic Membrane', 'TM Perforation (if present)', 'Middle ear / Discharge', 'Remarks'].map(label =>
new TableRow({
children: [
new TableCell({ children: [new Paragraph({ children: [new TextRun({ text: label, size: 20 })] })] }),
new TableCell({ children: [new Paragraph({ text: '' })] }),
new TableCell({ children: [new Paragraph({ text: '' })] })
]
})
)
]
}),
emptyLine(),
new Paragraph({
children: [new TextRun({ text: 'Tuning Fork Tests', bold: true, size: 22, underline: { type: UnderlineType.SINGLE } })],
spacing: { before: 100, after: 60 }
}),
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
rows: [
new TableRow({
tableHeader: true,
children: [
new TableCell({ children: [new Paragraph({ children: [new TextRun({ text: 'Test', bold: true, size: 20 })], alignment: AlignmentType.CENTER })], shading: { type: ShadingType.CLEAR, fill: 'BDD7EE' } }),
new TableCell({ children: [new Paragraph({ children: [new TextRun({ text: 'Frequency', bold: true, size: 20 })], alignment: AlignmentType.CENTER })], shading: { type: ShadingType.CLEAR, fill: 'BDD7EE' } }),
new TableCell({ children: [new Paragraph({ children: [new TextRun({ text: 'Result', bold: true, size: 20 })], alignment: AlignmentType.CENTER })], shading: { type: ShadingType.CLEAR, fill: 'BDD7EE' } })
]
}),
...['Rinne (Right)', 'Rinne (Left)', 'Weber', 'Absolute Bone Conduction (ABC)'].map(label =>
new TableRow({
children: [
new TableCell({ children: [new Paragraph({ children: [new TextRun({ text: label, size: 20 })] })] }),
new TableCell({ children: [new Paragraph({ children: [new TextRun({ text: '512 Hz', size: 20 })] })] }),
new TableCell({ children: [new Paragraph({ text: '' })] })
]
})
)
]
}),
emptyLine(),
// ── NOSE EXAMINATION ────────────────────────────────────────────────────
sectionHeading('NOSE EXAMINATION'),
fillLine('External Nose:'),
fillLine('Anterior Rhinoscopy - Septum:'),
fillLine('Turbinates:'),
fillLine('Discharge / Polyp / Mass:'),
fillLine('Posterior Rhinoscopy / Nasopharynx:'),
fillLine('PNS Tenderness:'),
emptyLine(),
// ── THROAT EXAMINATION ──────────────────────────────────────────────────
sectionHeading('THROAT EXAMINATION'),
fillLine('Oral cavity / Teeth / Gums:'),
fillLine('Oropharynx / Tonsils / Posterior pharyngeal wall:'),
fillLine('Tonsil size (Brodsky): ☐ T1 ☐ T2 ☐ T3 ☐ T4'),
fillLine('Indirect Laryngoscopy / Flexible Nasopharyngoscopy:'),
fillLine('Vocal Cords:'),
fillLine('Subglottis / Trachea:'),
emptyLine(),
// ── NECK EXAMINATION ────────────────────────────────────────────────────
sectionHeading('NECK EXAMINATION'),
fillLine('Lymph Nodes (site / size / consistency / mobility):'),
fillLine('Thyroid / Parotid / Other swelling:'),
emptyLine(),
// ── INVESTIGATIONS ──────────────────────────────────────────────────────
sectionHeading('INVESTIGATIONS'),
...checkboxGroup('Audiology:', ['PTA', 'Tympanometry', 'BERA/ABR', 'OAE', 'VEMP', 'Speech audiometry']),
...checkboxGroup('Imaging:', ['X-ray PNS (Waters / PA)', 'HRCT Temporal Bone', 'CT PNS', 'MRI IAC with Gadolinium', 'MRI brain', 'CT Neck', 'MRI Neck', 'USG Neck']),
...checkboxGroup('Bloods:', ['CBC', 'ESR', 'CRP', 'Blood glucose', 'Thyroid function', 'FTA-ABS / VDRL', 'ANA / Anti-dsDNA', 'LFT', 'RFT']),
...checkboxGroup('Microbiology:', ['Ear swab C/S', 'Throat swab', 'Nasal swab']),
...checkboxGroup('Biopsy / Histology:', ['Nasal biopsy', 'Ear biopsy', 'Throat / Tonsil biopsy', 'Neck FNAC']),
fillLine('Other:'),
emptyLine(),
// ── DIAGNOSIS ───────────────────────────────────────────────────────────
sectionHeading('DIAGNOSIS / IMPRESSION'),
fillLine('Provisional Diagnosis:'),
fillLine('Differential Diagnosis:'),
emptyLine(),
// ── MANAGEMENT ──────────────────────────────────────────────────────────
sectionHeading('MANAGEMENT PLAN'),
...checkboxGroup('Plan:', ['Medicines', 'Investigations ordered', 'Review with reports', 'Refer to Audiology', 'Refer to Neurotology', 'Refer to Ophthalmology', 'Refer to Neurology', 'Surgical plan', 'Admission']),
fillLine('Rx / Medications:'),
fillLine('Patient Counselling:'),
twoColFill('Follow-up:', 'Surgeon Signature:'),
emptyLine(),
new Paragraph({
children: [new TextRun({ text: '─────────────────────────────────────────────────────────────────', color: 'CCCCCC', size: 16 })],
alignment: AlignmentType.CENTER
}),
new Paragraph({
children: [new TextRun({ text: 'ENT OPD Proforma | Confidential Medical Record', size: 16, color: '888888', italics: true })],
alignment: AlignmentType.CENTER
})
]
}]
});
Packer.toBuffer(doc).then(buffer => {
fs.writeFileSync('/home/daytona/workspace/ent-opd-template/ENT_OPD_Proforma.docx', buffer);
console.log('Done: ENT_OPD_Proforma.docx created successfully.');
});
cd /home/daytona/workspace/ent-opd-template && node create_template.js
python /home/daytona/skills/docx/scripts/office/validate.py /home/daytona/worksp…
cd /home/daytona/workspace/ent-opd-template && python3 -c " import zipfile, os w…
ENT OPD Proforma
Word Document · DOCX
| Section | Contents |
|---|---|
| Patient Details | Name, age, sex, OP number, date, referral |
| Chief Complaint | Free text + duration |
| Ear Symptoms | Hearing loss, tinnitus, vertigo, discharge, otalgia, aural fullness - all with checkboxes |
| Nose & Sinus Symptoms | Obstruction, rhinorrhoea, epistaxis, smell, allergy, facial pain |
| Throat & Oral Symptoms | Dysphagia, hoarseness, stridor, neck swelling, snoring/OSA |
| Past History | Prior ENT surgery (specific procedures), medical conditions, ototoxic medications |
| Social History | Noise exposure, smoking, alcohol, occupation, family history |
| General Examination | Vitals, LN, built |
| Ear Examination | Otoscopy table (Right/Left), tuning fork tests (Rinne, Weber, ABC) |
| Nose Examination | Anterior/posterior rhinoscopy, septal findings, turbinates |
| Throat Examination | Oral cavity, tonsil grading (Brodsky), ILS/flexible scope findings, vocal cords |
| Neck Examination | LN, thyroid, parotid |
| Investigations | Checkboxes for audiology, imaging, bloods, microbiology, biopsy |
| Diagnosis / Management | Provisional + differential diagnosis, Rx, plan, follow-up, signature |