35 documented public-health events. Every fact cites a primary source. Zero AI content.
➜ SWIPE NOW · ➜ DATASET API · ➜ CITE IT
Spring-physics drag · 3D card-stack peek · memorial mode · DNA fingerprint per card · works offline · <30 KB shell · 35 entries
1918 Influenza R₀ 1.4–2.8 · 50–100M deaths |
Black Death (1347) CFR 30–60% · 75M deaths |
1665 London Plague 100,000 deaths in London alone |
2014 Ebola (W. Africa) 11 countries · 28,616 cases |
Click any photo to open that entry in the live deck.
You've definitely Googled "how bad was the 1918 flu" at some point. You landed on an ad farm that cited no sources, or asked an LLM that confidently hallucinated the R₀. OutbreakTinder is the answer you were actually looking for: a fast, swipeable reference for the outbreaks that shaped human history — every number cited, every community named, every entry sensitivity-reviewed before it ships.
Swipe left on the ones that fascinate you least. Swipe right on the ones you want to read more about. Open the detail page. Follow the citation to CDC, WHO, or NIH. Learn something real.
| 🃏 | Swipe deck: 3D card-stack, spring-physics drag, gesture on mobile and keyboard on desktop |
| 🧬 | DNA fingerprint: each card's color strip encodes R₀, CFR, era, and pathogen type — you start pattern-matching without realizing it |
| 📚 | Primary sources only: R₀, CFR, and death toll each link to CDC, NIH, WHO, NARA, or peer-reviewed literature |
| 📖 | Detail pages: /outbreak/<slug> — stable forever, embeddable, JSON-LD structured data, BibTeX citation snippet |
| ♿ | Accessible by default: keyboard navigation · screen-reader memorial narration · axe-clean · prefers-reduced-motion respected |
| 🔒 | Sensitivity-first: community-centered framing, memorial mode on for outbreaks within living memory, 48-hr public review window |
| 📱 | PWA: installable, works fully offline after first load |
| 💸 | $0/month: Cloudflare Pages free tier · no analytics · no LLM content · no trackers |
| 🤖 | LLM-citable: CC0 dataset, Hugging Face mirror, llms.txt, BibTeX per entry — so the models cite us instead of guessing |
| 🎯 | Modal polish: all overlays (DeckCoach, DNADecoder, KeyboardHelp, FilterBar) animate in and out with spring-matched exit curves |
| 🛡️ | Error boundary: Preact class-based boundary wraps the entire deck — crashes show a graceful fallback, never a blank screen |
| ⏳ | Loading skeleton: shimmer placeholder visible during the Astro hydration gap — no layout shift, no flash of empty |
All 8 transmission types. All 5 pathogen types. Antiquity to 2023.
| Outbreak | Era | Transmission | R₀ | CFR |
|---|---|---|---|---|
| Plague of Justinian | 541–549 | vector | 1.5–3.0 | 40–70% |
| Black Death | 1346–1353 | vector | 1.5–3.0 | 30–75% |
| Great Plague of London | 1665–1666 | vector | 1.3–2.0 | 30–60% |
| 1793 Philadelphia Yellow Fever | 1793 | vector | 2.8–7.0 | 10–50% |
| First Cholera Pandemic | 1817–1824 | fecal-oral | 1.5–2.5 | 30–50% |
| 1854 Broad Street Cholera | 1854 | waterborne | 1.5–2.5 | 30–50% |
| Third Plague Pandemic | 1855–1960 | vector | 1.5–3.0 | 30–60% |
| 1918 Influenza | 1918–1920 | respiratory | 1.4–2.8 | 2–3% |
| 1957 H2N2 (Asian Flu) | 1957–1958 | respiratory | 1.5–1.7 | 0.1–0.4% |
| 1968 H3N2 (Hong Kong Flu) | 1968–1970 | respiratory | 1.06–2.06 | 0.1–0.5% |
| 1976 Ebola Yambuku | 1976 | contact | 1.3–2.7 | 88% |
| HIV/AIDS Pandemic | 1981–present | bloodborne | 2.0–5.0 | 80–95% untreated |
| 1993 Hantavirus (Four Corners) | 1993 | zoonotic | — | 36–40% |
| 2003 SARS | 2002–2003 | respiratory | 2.0–4.0 | 9.6–11% |
| 2009 H1N1 (Swine Flu) | 2009–2010 | respiratory | 1.4–1.6 | 0.001–0.02% |
| 2012 MERS-CoV | 2012–present | respiratory | 0.3–0.8 | 34–36% |
| 2014 West African Ebola | 2013–2016 | contact | 1.5–2.5 | 39–71% |
| 2015–2016 Zika Epidemic | 2015–2016 | vector | 2.0–6.3 | 0.01–0.1% |
| COVID-19 Pandemic | 2019–present | respiratory | 2.5–7.0 | 0.5–3.5% |
| 2022 mpox Outbreak | 2022–2023 | contact | 1.1–2.4 | 0.03–0.1% |
| Antonine Plague | 165–180 | respiratory | 2.0–5.0 | 7–25% |
| Smallpox (variola) | Antiquity–1980 | respiratory | 3.5–6.0 | 20–40% |
| Measles | 7th c.–present | respiratory | 12–18 | 0.1–5% |
| Tuberculosis | Antiquity–present | respiratory | 1.0–4.5 | 5–50% |
| Epidemic Typhus | 16th c.–20th c. | vector | 1.5–3.0 | 10–60% |
| Malaria | Antiquity–present | vector | 5–100 | 0.3–20% |
| Dengue | 18th c.–present | vector | 1.5–6.0 | 0.01–2.5% |
| Polio (20th century) | 1900s–present | fecal-oral | 5.0–7.0 | 2–10% |
| Syphilis | 15th c.–present | sexual | 1.5–3.0 | 8–58% untreated |
| Rabies | Antiquity–present | zoonotic | — | ~100% untreated |
| Nipah Virus | 1998–present | contact | 0.3–0.5 | 40–75% |
| BSE / vCJD | 1986–present | zoonotic | — | 100% |
| Candida auris | 2009–present | contact | 1.2–3.0 | 30–60% |
| Leprosy | Antiquity–present | respiratory | 1.0–2.0 | 0.1–5% |
| Chagas Disease | Pre-Columbian–present | vector | 1.0–2.0 | 0.5–5% |
Every record is CC0 — no attribution required. Fork it. Remix it. Teach with it.
| Format | URL |
|---|---|
| JSON (CORS open) | /api/outbreaks.json |
| CSV | /api/outbreaks.csv |
| BibTeX | /api/outbreaks.bib |
| Hugging Face | outbreaktinder/dataset |
| LLM guidance | /llms.txt |
// Fetch the full dataset — three CDN options, pick your stack's flavor
const res = await fetch('https://outbreaktinder.pages.dev/api/outbreaks.json'); // Cloudflare Pages
const res = await fetch('https://cdn.jsdelivr.net/gh/ByteWorthyLLC/outbreaktinder@main/data/outbreaks.json'); // JSDelivr
const entries = await res.json();
// → [{ slug, name, era, pathogen_type, r0_low, r0_high, cfr_pct, deaths_low, deaths_high, ... }]TypeScript? The Zod schema is in src/schemas/outbreak.ts — copy it for type-safe parsing.
Drop OutbreakTinder in any HTML-aware editor — Substack, Ghost, Notion, WordPress:
<iframe
src="https://outbreaktinder.pages.dev/"
title="OutbreakTinder: historic public-health events"
loading="lazy"
width="100%" height="720"
style="border:0;border-radius:24px;max-width:480px"
allow="fullscreen"></iframe>git clone https://github.com/ByteWorthyLLC/outbreaktinder.git
cd outbreaktinder
npm install
npm run dev # → http://localhost:4321
npm test # 80 Vitest unit tests
npm run build # static → dist/ (<30 KB gzipped shell)
npm run typecheck # tsc --noEmit, zero warnings
npm run lint # ESLint + Prettier + StylelintStack:
Astro 6 one Preact island (client:load), all other pages pure SSG
@use-gesture/vanilla drag gesture, ~3 KB
popmotion spring physics (stiffness=170, damping=22)
@preact/signals deck index, drag offset, memorial flag — reactive, tiny
Zod runtime OutbreakSchema validation at build time
@vite-pwa/astro service worker + manifest
satori + sharp build-time OG card PNGs (one per entry)
TypeScript strictest noUncheckedIndexedAccess, no any, exact optional props
useModal hook shared exit animation, Escape handling, and focus trap
ErrorBoundary Preact class component — crash fallback, never blank screen
Loading skeleton MutationObserver hides shimmer once Preact island hydrates
Architecture docs: docs/SCHEMA.md · docs/adr/ · src/components/Deck.tsx
- Embed:
<iframe>above, no login, no paywall, mobile-first - Dataset: CC0 — fork, remix, reuse with or without attribution
- Primary sources: every entry's detail page links directly to CDC/NIH/WHO/PubMed
- Cite this:
CITATION.cff→ GitHub's "Cite this repository" button → one click to APA, BibTeX, or Chicago - Hugging Face: outbreaktinder/dataset — versioned, indexed by academic and LLM citation tools
If you build a lesson plan, curriculum module, or research dataset from OutbreakTinder, open a Show & Tell discussion — we'd love to see it.
Press or media inquiries: Richardskef@gmail.com
The dataset grows through community contribution. Every entry requires a primary-source citation and a sensitivity review before it merges.
- Read
docs/SENSITIVITY.md— the editorial spine - Open an Add an Outbreak issue
- Follow
docs/ADD_AN_OUTBREAK.md - We review within 48 hours
OutbreakTinder follows WHO/CDC guidance on disease naming. It never uses stigmatizing place-based names. It centers affected communities rather than erasing them. Every entry is reviewed against docs/SENSITIVITY.md before merge. Memorial mode is the canonical render for outbreaks within living memory. Editorial decisions — accepts, rejects, and reversals — are logged publicly in data/decisions.json.
docs/METHODOLOGY.md— selection criteria, sourcing tiers, review cadencedocs/SENSITIVITY.md— tone matrix, naming conventions, victim-naming rulesdocs/SOURCES.md— full bibliography of primary archivesdata/decisions.json— public editorial log
| Code | MIT |
| Dataset | CC0 1.0 Universal — public domain, no attribution required |
| Images | Per-record license: public-domain · cc0 · cc-by · cc-by-sa |
@software{outbreaktinder_2026,
author = {Richards, Kevin and {OutbreakTinder Contributors}},
title = {OutbreakTinder: a swipe-deck of historic public-health events},
year = {2026},
url = {https://github.com/ByteWorthyLLC/outbreaktinder},
license = {MIT},
}GitHub's "Cite this repository" button → CITATION.cff → APA, BibTeX, or Chicago in one click.
No trackers · No LLMs · No paid APIs · $0/month · Built by ByteWorthy · MIT code · CC0 dataset