A public nomination map connecting people who've done the ALS Ice Bucket Challenge, and who they nominated, in support of Rebel (Tanea Brooks), who is battling ALS.
See PROJECT_SPEC.md for the full design rationale, and
CONTRIBUTING.md to add a nomination.
/data/*.json— one file per person; including links to associated posts, who nominated them, who they nominated (thoughnpm run addwrites these for you — seeCONTRIBUTING.md)./scripts/— the build pipeline and contributor CLI tools: schema validation,web/data.jsongeneration, and theadd/check-linkscommands. See "Scripts" below for the breakdown./web/— the static site.index.html+styles.css+app.jsfetchdata.jsonat runtime and render either the tree+cross-links view or the layered-DAG view (toggle, no re-fetch), using D3 loaded via CDN — no frontend build step.
npm run add -- --name "..." --label "..." [options] # create data/<id>.json — see CONTRIBUTING.md
npm run validate # check /data without writing output (what CI runs)
npm run build # validate + write web/data.json
npm run check-links # optional, hits every link in the dataset over the network
npm test # unit tests for the trickier validation rules
-
scripts/build-data.js(npm run validate/npm run build) — validates every file in/data(schema, id uniqueness) and computes everything the spec marks as derived (primaryParent,secondaryParents,depth,isComplete,nominates, per-linkplatform).--check(whatvalidateruns) stops after validation; without it (build), writes the result toweb/data.json. -
scripts/add-person.js(npm run add) — createsdata/<id>.json. Dry-run by default,--writeto apply — seeCONTRIBUTING.mdfor the full flag list. There's no equivalent CLI for editing an existing person's file afterward — that's a direct hand-edit, thennpm run validate— seeCONTRIBUTING.md. -
scripts/check-links.js(npm run check-links) — fetches every link in the dataset and reports which didn't return success. Optional and non-blocking, including in CI (see below). -
scripts/lib/— shared logic the scripts above are built from:validate.js— schema rules, plus a non-blocking warning when anominatedBy/nominatesfree-text entry slugifies to an id that already has a filederive.js— the derived-fields computation, including cycle detection onnominatedBysynthesize.js— turns unresolvednominatedBy/nominatestext into stub nodes, slugifying and matching against existing ids firstslugify.js— display name → kebab-case idplatforms.js— URL hostname → platform lookupfiles.js— recursive/dataglobdiff.js— the field-level diffadd's dry-run output uses when a--nominatesreference stages an update to a second, already-existing file
Unit-tested pieces live in
test/, run vianpm test.
web/ is fully static (fetches data.json via a relative path), so any
static file server works, e.g.:
npx serve web
web/data.json is gitignored (see Deploying) — it needs to exist on disk
first. npm run build generates it, and npm run add -- --write already
runs that for you by default, so this is usually only something to remember
right after a fresh clone.
Hosted on Netlify, configured by netlify.toml
at the repo root (build command npm run build, publish directory web).
Connect the repo once via Netlify's "Add new site → Import an existing
project" and it picks up netlify.toml automatically — no separate
dashboard config needed. web/data.json is never committed — it's a build
artifact, generated fresh on every deploy, so it can't go stale relative to
/data.
Every PR also gets its own Netlify Deploy Preview automatically — no config needed beyond the initial connect — linked in a PR comment/check and torn down when the PR closes.
Scaffolding, validation, the build pipeline, and the live site (both views,
detail panel with video embeds, pan/zoom, posted gallery) are all in place
and working. Real roster population is ongoing via PRs — see /data/*.json
for the current state. The timeline view is designed for but not yet built;
see PROJECT_SPEC.md for the full status and what's
still deferred.