Skip to content

ByteWorthyLLC/outbreaktinder

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

89 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
OutbreakTinder — Tinder for plagues. 35 documented outbreaks, every fact cited.

OutbreakTinder

Tinder. For plagues.

35 documented public-health events. Every fact cites a primary source. Zero AI content.

Try it live CI Dataset: CC0


➜ SWIPE NOW  ·  ➜ DATASET API  ·  ➜ CITE IT


Deploy to Cloudflare Pages Open in Codespaces


Animated demo: swipe left (pass) or right (fascinating) through historic outbreak cards with spring-physics drag
Spring-physics drag · 3D card-stack peek · memorial mode · DNA fingerprint per card · works offline · <30 KB shell · 35 entries

The deck, in pictures

1918 Influenza pandemic — Camp Funston hospital ward, Kansas. US Army photo.
1918 Influenza
R₀ 1.4–2.8 · 50–100M deaths
Black Death — The Triumph of Death by Pieter Bruegel the Elder, c.1562
Black Death (1347)
CFR 30–60% · 75M deaths
1665 Great Plague of London — historical broadsheet illustration
1665 London Plague
100,000 deaths in London alone
2014 Ebola West Africa — Ebola virion electron micrograph, CDC/NIAID
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.


What's in the deck

🃏 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

The 35 entries

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%

The dataset

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.

Embed it

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>
QR code — scan to open outbreaktinder.pages.dev on mobile
Scan to open on your phone

For developers

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 + Stylelint

Stack:

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


For educators and researchers

  • 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


Add an entry

The dataset grows through community contribution. Every entry requires a primary-source citation and a sensitivity review before it merges.

  1. Read docs/SENSITIVITY.md — the editorial spine
  2. Open an Add an Outbreak issue
  3. Follow docs/ADD_AN_OUTBREAK.md
  4. We review within 48 hours

Good first issues


Editorial principles

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.


License & citation

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


⬆ back to top