An elegant cardiac auscultation training app for medical learners.
Don't just test recall—teach the ear. Link S1/S2 timing → systolic/diastolic → envelope → maneuver response
Master cardiac murmur identification in ≤5 seconds by:
- Seeing the phonocardiogram with S1/S2 markers
- Hearing the actual murmur
- Understanding why this, not that
Built following the Ultrathink Manifesto: crafted, not coded.
# Install dependencies
npm install
# Run development server
npm run dev
# Open http://localhost:3000Each case is clinically validated and teaches key discriminators:
- Aortic Stenosis (AS) - Crescendo-decrescendo at RUSB
- Ventricular Septal Defect (VSD) - Harsh holosystolic at LLSB
- Mitral Regurgitation (MR) - Holosystolic at apex → axilla
- Tricuspid Regurgitation (TR) - Holosystolic + inspiration ↑ (Carvallo)
- Patent Ductus Arteriosus (PDA) - Continuous "machinery"
- Aortic Regurgitation (AR) - Early diastolic decrescendo
- Mitral Stenosis (MS) - Mid-diastolic rumble + opening snap
- Still's Murmur - Innocent vibratory, softer standing
- Hypertrophic Cardiomyopathy (HCM) - Dynamic (↑ Valsalva, ↓ squat)
- Innocent Pulmonary Flow - Soft midsystolic at LUSB
- ✅ Waveform visualization with S1/S2 timing
- ✅ Audio playback (spacebar to play/pause)
- ✅ 5-choice NBME-style questions (keyboard 1-5)
- ✅ Rich feedback with "why this, not that" differentials
- ✅ Precordial site map that lights up on reveal
- ✅ Maneuver effects table (standing, squat, inspiration)
- 🔥 Streak tracking
- 🎯 Accuracy percentage
- 📊 Per-lesion statistics
- 📥 CSV export for debriefs
- ⌨️ Keyboard navigation: Space (play/pause), 1-5 (choices), Enter (reveal/next)
- 🎨 Clear visual states: idle → playing → answered → revealed
- 📱 Responsive design: works on desktop and tablet
.
├── app/
│ ├── layout.tsx # Root layout
│ ├── page.tsx # Main quiz interface
│ └── globals.css # Tailwind + custom styles
├── components/
│ ├── WaveformPane.tsx # Phonocardiogram with S1/S2 markers
│ ├── AudioControls.tsx # Play/pause with spacebar
│ ├── ChoiceList.tsx # 5 choices with keyboard support
│ ├── RevealPanel.tsx # Teaching feedback
│ ├── SiteMap.tsx # Precordial map
│ └── ProgressBar.tsx # Stats + CSV export
├── lib/
│ ├── types.ts # TypeScript definitions
│ ├── schema.ts # Zod validation
│ ├── cases.ts # 10 canonical cases
│ └── store.ts # Zustand state management
├── public/
│ ├── audio/ # MP3 murmur files
│ └── waveforms/ # PNG phonocardiograms
└── README.md
- Think Different - Question every assumption
- Obsess Over Details - Every pixel, every transition matters
- Craft, Don't Code - Implementation as performance art
- Simplify Ruthlessly - Nothing exists unless it must
- Next.js 14 - Modern React framework
- TypeScript - Type safety is craft
- Tailwind CSS - Utility-first styling
- Zustand - Lightweight state management
- Zod - Runtime validation
To add a new murmur case, edit lib/cases.ts:
{
id: "new_case_01",
media: {
audio_url: "/audio/new_case_01.mp3",
image_url: "/waveforms/new_case_01.png",
},
choices: ["Choice 1", "Choice 2", "Choice 3", "Choice 4", "Choice 5"],
answer: "Choice 1",
explain: {
correct: "Why this diagnosis is correct...",
differentials: [
"Why not choice 2...",
"Why not choice 3...",
"Why not choice 4...",
"Why not choice 5...",
],
},
tags: ["systolic", "ejection"],
maneuver_effects: {
standing: "↑",
squat: "↓",
},
meta: {
difficulty: "core",
site_hint: "RUSB",
},
}All cases validated against:
- UCSF Hospitalist Handbook (valvular disease, maneuvers)
- Stanford Medicine 25 (AR, MS, diastolic murmurs)
- NCBI StatPearls (MR, HCM, physiology)
- Merck Manuals (VSD, pediatric cases)
- American Academy of Family Physicians (innocent murmurs)
Use this as a 5-minute warm-up at morning conference:
- Run through 5-10 cases as a team
- Export CSV of misses
- Drive targeted mini-talk on common errors
Built with ❤️ for medical education. Open source - use it, fork it, teach with it.
Inspired by the Ultrathink Manifesto:
"Don't just write code. Make a dent in the universe."
This isn't an app. It's a teaching moment, wrapped in software.