A curiosity toolkit for historical public-health events.
Swipe. Compare. Explore. Cite. Free, open-source, primary-source-only.
➜ TRY THE LIVE DEMO · ➜ READ THE DATASET · ➜ EMBED IT · ➜ CITE IT
Search "1918 flu R₀" and you land on an ad-laden listicle. Search "Spanish flu mortality" and an LLM hallucinates the answer.
Public-health history deserves a better front door. OutbreakTinder takes the curated record of historic public-health events and presents it as a swipe deck — fast, mobile-first, accessible by default, free forever, and with every fact linked to a primary archive.
It's a marketing platform for the truth, dressed in a UI that makes you actually want to scroll.
| 🃏 | Swipe-deck UX — 3D card stack, spring-physics drag, liquid-glass surface, memorial-mode toggle |
| 📚 | Primary-source citations — every fact links to CDC, NIH, WHO, NARA, or peer-reviewed literature |
| 🎯 | Stable URLs forever — every entry has a permalink that never moves: /outbreak/<slug> |
| 📦 | Open dataset, three mirrors — GitHub repo · CORS-open API · Hugging Face Datasets |
| ♿ | Accessible by default — keyboard navigation, screen-reader memorial narration, axe-clean, reduced-motion respected |
| 📱 | PWA + offline — installable, works fully offline after first load |
| 🔒 | Sensitivity-passed — every entry reviewed against docs/SENSITIVITY.md before merge |
| 💸 | $0/month — no paid hosting, no paid analytics, no LLM-generated content, no trackers |
| 🤝 | Embed-friendly — drop it in Substack, Ghost, WordPress with one <iframe> |
| Surface | URL |
|---|---|
| Live app | outbreaktinder.pages.dev |
| GitHub Pages landing | byteworthyllc.github.io/outbreaktinder |
| Public dataset (CORS open) | outbreaktinder.pages.dev/api/outbreaks.json |
| Hugging Face mirror | huggingface.co/datasets/outbreaktinder/dataset |
| RSS | outbreaktinder.pages.dev/feed.xml |
| llms.txt | outbreaktinder.pages.dev/llms.txt |
Paste this into Substack, Ghost, WordPress, or any HTML-aware editor:
<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>Or fetch the dataset directly. Three CDN URLs, pick the one your stack already trusts:
// 1. Cloudflare Pages — primary, CORS open
const res = await fetch('https://outbreaktinder.pages.dev/api/outbreaks.json');
// 2. JSDelivr — fast global CDN backed by GitHub raw, immutable per-tag
const res = await fetch('https://cdn.jsdelivr.net/gh/ByteWorthyLLC/outbreaktinder@main/data/outbreaks.json');
// 3. Hugging Face Datasets — versioned, indexed by LLM citation tools
const res = await fetch('https://huggingface.co/datasets/outbreaktinder/dataset/resolve/main/outbreaks.json');
const entries = await res.json();For TypeScript users, the canonical Zod schema is src/schemas/outbreak.ts — copy it into your project to get type-safe parsing for free.
| OutbreakTinder | Wikipedia "List of epidemics" | Our World in Data | CDC PHIL | |
|---|---|---|---|---|
| Mobile-first interactive UX | ✅ | ❌ | ❌ | |
| Primary-source citation per fact | ✅ | ✅ | ✅ | |
| Open dataset (CC0) | ✅ | ✅ CC-BY | ||
Embed-friendly (<iframe>) |
✅ | ❌ | ❌ | |
| PWA / works offline | ✅ | ❌ | ❌ | ❌ |
| Editorial sensitivity rubric | ✅ | ❌ | ❌ | n/a |
| LLM-citable (Hugging Face mirror) | ✅ | ❌ | ❌ | ❌ |
| $0/month operationally | ✅ | n/a | n/a | n/a |
| No LLM-generated content | ✅ | ✅ | ✅ | ✅ |
| Citation file (CITATION.cff) | ✅ | ❌ | ❌ |
We love every one of these projects — they are our sources. OutbreakTinder is the interactive front door on top of them.
Astro 6 + Preact island (one client:load island, every other page is pure SSG)
@use-gesture/vanilla v10 ── drag gesture (~3 KB)
popmotion spring ── spring(stiffness=170, damping=22)
@preact/signals ── reactive deck index, drag offset, memorial mode
zod ── runtime dataset validation
@vite-pwa/astro ── manifest + Workbox service worker
satori + sharp ── build-time OG card PNGs (Phase 6.5)
TypeScript strictest ── noUncheckedIndexedAccess + exact optional props
Performance budget: < 30 KB gzipped JS shell, < 20 KB gzipped CSS. Enforced in CI by size-limit.
Hosting: Cloudflare Pages (static, free tier). $0/month operational ceiling.
git clone https://github.com/ByteWorthyLLC/outbreaktinder.git
cd outbreaktinder
npm install
npm run dev # dev server at http://localhost:4321
npm test # vitest
npm run lint # eslint + prettier + stylelint
npm run typecheck
npm run build # static output to dist/Architecture: see docs/SCHEMA.md, docs/adr/, and the inline comments on src/components/Deck.tsx.
We welcome bug fixes, accessibility improvements, dataset additions, and editorial review.
- Open an Add a Dataset Entry issue first
- Read
docs/SENSITIVITY.mdbefore drafting content - Read
docs/ADD_AN_OUTBREAK.mdfor the full template - Sign your commits:
git commit -s(DCO required) - See
CONTRIBUTING.mdfor the full workflow
- Free embed —
<iframe>snippet above, no paywall - Open dataset — CC0, fork it, remix it, no attribution required
- Primary sources — every entry has citations linking to CDC/NIH/WHO/NARA/PubMed
- Citation-ready —
CITATION.cffgives you BibTeX, APA, and Chicago in one click - Hugging Face mirror — appears in academic search and LLM citation indexes
Press inquiries: Richardskef@gmail.com
Reserved space for "made with" showcase — link back when you embed the deck or fork the dataset and we'll list you here.
Will populate as coverage lands.
We follow current WHO/CDC guidance on disease naming, never use stigmatizing place-based names, name affected communities rather than erasing them, and never publish LLM-generated content.
docs/METHODOLOGY.md— selection criteria, sourcing tiers, review cadencedocs/SENSITIVITY.md— editorial principles, tone matrix, naming conventionsdocs/SOURCES.md— bibliography of primary archivesdocs/SCHEMA.md— field-by-field reference fordata/outbreaks.jsondocs/adr/— Architecture Decision Records
Editorial review SLA: 48 hours. File an Editorial Review Request anytime.
OutbreakTinder runs on $0/month — Cloudflare Pages free tier, no paid analytics, no LLM costs. Optional support funds editorial reviewer honoraria, a custom domain, and commissioned line-art illustrations for entries where archive imagery is missing.
| Tier | What you get |
|---|---|
| $5 / one-time | "Add an Outbreak" — your name in the contributors list |
| $25 / one-time | "Editorial Reviewer" — credited on the next release |
| $100 / month | "Patron" — pinned in README + monthly progress note |
- Code: MIT
- Dataset: CC0 1.0 Universal
- Imagery: per-image license recorded in each record (
public-domain/cc0/cc-by/cc-by-sa)
@software{richards_outbreaktinder_2026,
author = {Richards, Kevin and {OutbreakTinder Contributors}},
title = {OutbreakTinder: an interactive educational tool for historic public-health events},
year = {2026},
url = {https://github.com/ByteWorthyLLC/outbreaktinder},
license = {MIT},
}GitHub's "Cite this repository" button reads CITATION.cff directly — one click for APA, BibTeX, or Chicago format.
See .planning/ROADMAP.md for the seven-phase plan and .planning/STATE.md for current status.
| Phase | Status |
|---|---|
| 1 — Foundation + OSS Scaffolding | ✅ |
| 2 — Content Seed + Editorial Rubric | ✅ |
| 3 — Content Scale-Out | 🚧 ongoing via PR |
| 4 — Swipe Deck + Vibe + A11y | ✅ |
| 5 — GitHub-as-marketing + dataset distribution | ✅ |
| 6 — PWA + Share + Perf + Deploy | ✅ |
| 7 — Launch + Community + Post-Launch Ops | 🚧 |
If you find OutbreakTinder useful, star the repo — it's the single biggest signal that pulls more contributors in.
Sponsor wall regenerated on each release from gh api /users/byteworthy/sponsors. Become a sponsor →
This project follows the all-contributors specification. After your first merged PR, a maintainer adds you here.
Built with care · MIT licensed · CC0 dataset · Public-domain imagery · No trackers · No LLMs · 100% open
Built by ByteWorthy. Subscribe at byteworthy.io/newsletter for updates on this project and new releases.