An educational 12-lead ECG simulator for Mac and iPad. Twelve rhythms, 42 teaching tracings and real paper geometry — with every lead computed from one turning cardiac vector, so the twelve always agree.
Fully offline, no account.
Version 1.0 · One app. Mac and iPad.
Works entirely offline · No account · No data collected

The engine represents cardiac electrical activity as a single vector turning in the chest. Each of the twelve leads is that same vector seen from its own angle, so the leads always agree with one another: Einthoven's law (II = I + III) and Goldberger's identity (aVR + aVL + aVF = 0) hold exactly, at every sample.
Axis shifts, bundle-branch patterns, injury currents and their reciprocal changes all follow from the geometry instead of from per-lead scripting. Choose an inferior injury current and the elevation appears in II, III and aVF while aVL goes reciprocally down — in the same instant, for the same reason a real heart does it.
II = I + III, to machine precision, on every sample.
Sixteen signal controls, grouped the way an ECG is read. Every one of them changes the signal itself, so the whole page answers at once — never a single lead redrawn on its own.
Sinus, atrial fibrillation, atrial flutter with selectable conduction ratio, SVT, first-degree AV block, Mobitz I, Mobitz II, third-degree block, ventricular tachycardia, ventricular fibrillation, asystole and ventricular pacing.
Premature atrial beats, occasional or frequent PVCs and bigeminy — with the compensatory pause emerging from the model rather than being scripted.
Frontal axis, RBBB and LBBB, QRS voltage and width, T-wave shape, QT scaling, U waves.
Six injury territories with adjustable displacement. Reciprocal changes appear on their own.
Baseline wander, muscle tremor and mains interference, applied to all leads at once — because that is how real artefact behaves.
Reset to Normal Sinus restores the textbook tracing — 72 bpm, PR 160 ms, QRS 90 ms, QTc 400 ms, axis 55° — without touching how you are looking at it.

Take the frontal axis to +110° and switch conduction to RBBB: the QRS widens to 140 ms, the axis readout reclassifies itself to Right, and the rS-to-qR progression across the chest leads rearranges itself — because the vector moved, not because twelve waveforms were swapped for twelve others.
Nothing is hidden behind a friendly label, and nothing is scripted per lead. The engine generates the signal at 500 samples per second and draws it in real time; a speed control from 0.1× to 10× slows the sweep enough to read a single wave, or fast-forwards through a slow rhythm.
Five groups — sinus and atrial, ventricular, conduction blocks, ischaemia and ST, morphology and electrolytes — each preset carrying a short description of what to look for on the page. One tap returns to normal sinus rhythm.
A sample of the catalogue




Applying a preset does not clear the sheet: the new signal walks onto the paper beside the old ink, so the change itself is visible. Reset is the only act that clears the page.
The sheet is metric and honest: 250 mm wide whatever the window, so each cell of the 4×3 page holds 2.5 s at 25 mm/s and a 1 mV R wave really is ten small squares at standard gain. A calibration pulse sits on every page and always shows the gain in force.

The printed 12-lead page — four columns of three, 2.5 s per cell, with the 10 s rhythm strip underneath.

The same twelve leads in two columns of six: limb leads left, chest leads right, about 5 s of every lead at once.

A 12-channel recorder page — every lead a full-width strip, roughly 17 s each, so a Wenckebach ladder or an AF response stays on screen.
25 or 50 mm/s, gain remembered per layout, sweep or scroll pen, and a rhythm strip whose lead you choose.
Light appearance draws Paper: the warm thermal sheet, dark ink, the familiar red millimetre grid. Dark appearance draws Monitor: a green phosphor trace with a faint embered grid on near-black. Auto follows your system, so the app moves from printout to bedside screen when your Mac or iPad does. The grid survives both — millimetres still have to be countable — and the signal, the geometry and every measurement are identical either way.

Dark ink on the warm thermal sheet. What a printed 12-lead looks like.

A green phosphor beam on near-black, the grid embered rather than gone.
Same rhythm, same layout, same numbers — the two panels differ only in the skin the stage is drawn on.
Heart rate measured from the beats themselves — in atrial fibrillation it wanders around the mean the way a bedside display does — plus a rhythm badge, PR, QRS, QT and QTc calipers, the QRS axis with its hexaxial classification, and a PVC-per-minute counter. The calipers and the paper can never disagree: both come from the same interval model that schedules the beats.

Taken from the last few R–R intervals of the drawn signal, not echoed from the slider — so in AF it wanders around the mean and in asystole it decays to "--".
The current rhythm, named beside the rate, flashing amber on an ectopic beat.
Stamped by the same interval model that schedules the beats, so the calipers and the ink can never disagree — and "—" wherever an interval is undefined.
The frontal axis with its hexaxial class: Normal, Left, Right or Extreme.
Ectopic-style beats in the last rolling minute, so bigeminy and occasional PVCs are separable at a glance.
The 1 mV pulse on every page and the caption under it — 25 mm/s · 10 mm/mV — say exactly what the paper you are reading is set to.
A single universal app: the same engine, the same 42 presets, the same twelve leads on both. On the Mac you get a resizable window, menu-bar commands and keyboard shortcuts; on iPad it runs full screen in landscape, with the controls and presets a tap away.




A resizable window, the two sidebars, and full menu-bar commands: Space to run or pause the paper, ⇧⌘R to reset, ⌘M to cycle the layout, ⌥⌘I for the controls — with every preset listed in the Simulation menu.
Landscape, full screen and touch-first, with the control and preset sidebars a tap away and the rhythm-strip lead picker in the toolbar menu. Big, legible traces make it a natural lecture tool: project it and change one knob live.
Rhythm recognition, axis, blocks and ST territories — practised on tracings you can change one knob at a time.
Big honest paper on a projector, three layouts, no login and no network. Load a preset and let the class read it before you name it.
A rehearsal bench for the strips that matter: the wide-complex tachycardias, the blocks, the paced rhythm, the artefact that mimics all three.
A model whose leads agree by construction, so the geometry behind an axis shift or a reciprocal change is visible rather than asserted.
A guide travels with the app: built-in Help explains every control, the twelve leads, each preset and the model behind them — all offline.
Einthoven Lab has no sign-in, no analytics, no cookies and no server. It never connects to sensors or hardware, and it works exactly the same in Airplane Mode — because it works entirely offline. Nothing leaves your device, because nothing is collected in the first place.
There is nothing to sign up for and nothing to sign in to. The app has no backend at all.
No analytics, no advertising frameworks, no telemetry. The only thing stored is your own display preferences, on your device.
Every feature works offline, in Airplane Mode, identically. The app makes no requests, so nothing about you can be sent anywhere.
The app never connects to electrodes, accessories or Bluetooth devices. Every tracing it draws is synthetic, generated by its own model.
Twelve leads that always agree — and knobs you can turn to see why.
Einthoven Lab generates synthetic ECG waveforms for education. It is not a medical device, does not measure or record physiological signals, and must not be used for diagnosis or patient care.