A live dashboard of scientific, technological, and strategic breakthroughs — scraped, scored, and pinned on a world map.
🌐 transhumanists.github.io · GitHub org · facebook.com/transhumanistsBE
The front page renders a live equirectangular world map (assets/js/worldmap.js) with no external
dependencies. The world is fitted inside the canvas at its natural 360:142 ratio and centred
rather than stretched, so a phone-shaped canvas is never distorted and a degree of longitude is
always the same number of pixels as a degree of latitude; geography is clipped to that fitted
plate. The map provides:
- Event dots colored by category (
data/events.json), with a day/night terminator overlay and sun position - Click-to-pin tooltips — category, metric value, source, date, and a View source link to the original report. A popup stays docked at its marker so that link is reachable, for milestones and for Human Rights landmarks alike
- Category legend (
CATEGORIES) with per-vertical event counts, plus a bulk-visibility eye that hides or restores every category at once. It follows the per-row switches in both directions — hiding categories one at a time closes it, re-selecting a single one reopens it — and deliberately leaves the operational layers below it alone - Operational layers, each with its own switch and count: Conflict Zones, Crisis Zones, Alliance & Defence Policy, Ground & Fleet Deployments, and Human Rights Violations. These are map layers rather than categories, and all of them are off by default. Alliance & Defence Policy nests inside Ground & Fleet Deployments and switches with its parent
- Interaction — drag to pan, wheel/double-click/
+/-to zoom,0to reset, and+/−/⟲buttons in the overlay - Keyboard accessible (arrow keys pan,
+/-zoom,0reset)
Legend colors, stat tiles and tooltips all resolve categories through a canonical alias map, so legacy names such as Energy, Quantum and Defense are treated as Renewable Energy, Quantum Physics and Military & Defense.
Tests. The unit suites need nothing but Bun and Python:
python -m pytest scripts/ -q # pipeline, validator, workflow lint
bun test test/ # map widget unit testspython scripts/verify_release.py runs everything CI runs, in CI's order, plus the
determinism gate, and is what a local pre-push hook calls. It compares your Bun
against the version CI pins and says so, because a green run on the wrong Bun is the
failure mode it exists to catch. --skip-determinism is the fast inner loop and
--also-bun /path/to/other-bun cross-checks the JS suite against a second toolchain.
The pinned version itself lives in .bun-version, so the toolchain is declared once
in the repository instead of only in the workflow YAML. verify_release.py treats
that file as the local expectation and still compares it against the version CI
installs, so the two drifting apart is reported rather than silently accepted.
Geocoding from the article. python scripts/article_geocode.py --report shows
what still has no location and why - including the "ambiguous" and "uncorroborated"
refusals, which is where the honest gaps are. --refresh fetches article bodies for
those records and stores the derived outcome (coordinate, confidence, evidence) in
data/geocode_cache.json; it deliberately never keeps the fetched text, since
everything under data/ is published and third-party prose does not belong on the
site. --apply writes the resolved coordinates back.
Evidence is scored rather than first-matched: title outranks summary, an affiliation outranks both, and a record only gets a dot when two independent routes agree or it beats a rival by a clear margin. Everything else stays unlocated on purpose - a missing dot is visibly missing, a wrong one is confidently wrong. Fetching is limited to public addresses, and each redirect hop is re-checked, because the URLs come from an upstream this repository does not control.
Where a dot came from. Every published event and archive record carries
location_confidence, naming the evidence pass that placed it: stated (the
upstream record had its own coordinate), institution (a lab named in the text),
place, subcategory, source (the publisher's HQ — a guess), or unlocated. The
current database is 92 stated, 5 source, 2 place, 6 unlocated, so the five
publisher-placed dots are identifiable rather than being silently mixed in with the
well-sourced ones. scripts/location_contract.py holds the single definition of what
counts as "no location"; the pipeline, the validators and the coverage report all call
it rather than repeating the rule.
Auditing the data. python scripts/check_data.py validates every published
data file, including the append-only archive. python scripts/coverage_report.py
answers the two questions validation cannot: which milestones are unlocated or
wrongly geocoded, and which years are empty on the slider. Read-only; --json for
CI. It fails the build only on null-island - a coordinate of exactly (0, 0), which
is upstream's "location unknown" sentinel and plots a dot in the Gulf of Guinea.
Low coverage and unlocated records are reported but never fail anything, because
they are a filling backlog rather than a regression:
$ python scripts/coverage_report.py
unique milestones 106 (from 254 records, 148 duplicated across files)
geocoded 92
unlocated 14 (no dot on the map - correct, not a bug)
years 1945-2026 populated 31 / 82 empty 51
empty years: 1946-1952, 1955-1956, ... 2024-2025
Point it at a candidate data set with WORLDMAP_DATA_DIR=/path/to/data. The
unlocated list is the geocoding backlog: each row is a record with evidence
(title, summary, source, subcategory) that geocode_milestone() can work from.
python scripts/publish_invariants.py asserts the properties that only make sense
across the whole set of files: no origin sentinel anywhere in the payload tree, only
known location_confidence values, no record claiming located: true without a
usable coordinate, and every live milestone present in the archive so the year
slider's history cannot silently lose records. It runs in CI, in verify_release,
and in the cron before it is allowed to commit.
--snapshot appends to data/coverage_history.json, but only when the findings
actually change, so that file is a changelog of progress toward filling the year gaps
rather than a timestamp every six hours.
Auditing metric comparability. python scripts/check_data.py validates the
shape of a metric - present, right types, right ranges. It cannot tell whether the
metric is comparable to its neighbours, and that is the thing that silently broke
when the scrapers widened their source list: the record count went up, so the run
looked like progress, while the share of records carrying a number and a unit fell.
A record whose value is its own title renders as a number-shaped blank - it
counts, it appears, and it can never be ranked against anything.
python scripts/metric_coverage.py answers that, per (category, subcategory):
$ python scripts/metric_coverage.py
category subcategory recs cmp coherence units
Quantum Physics quantum_supremacy 2 2 0.50 qubitsx1, qvx1 <-- mixed units
Spaceflight & Aeronautics launch 6 1 1.00 tonnesx1 <-- mostly prose
total 110 records · 57 comparable (51.8%) · 0 unitless · 53 prose
cmp counts records with a number and a unit. coherence is the largest share of
any one unit in the subcategory: below 1.00 means the numbers there cannot be ranked
against each other at all, however many of them there are. That is the subtler half of
"comparable", and it is the half that broke - qubits against qv, MJ against
minutes. Cosmetic spelling (% vs percent) is normalised away first, but
qualifiers are not: physical qubits and logical qubits are different quantities
and stay flagged.
--gate is the part CI runs. It fails when a subcategory becomes less comparable
than the recorded baseline, when a new subcategory mixes units, or when a metric that
was extractable is republished as prose. Adding records never fails it, and the debt
already on the baseline is reported rather than enforced - a gate that is red from day
one is a gate nobody reads. data/metric_coverage_baseline.json is therefore a
ratchet: when comparability genuinely improves, re-record it with
--update-baseline so the bar moves up rather than drifting downward silently.
The upstream extractor carries the matching instruction, including a per-category
contract naming the one quantity each subcategory tracks; see
llm/score_milestone.py in transhumanists/apis, which pins it with
tests/test_metric_prompt.py.
GitHub Actions runs six jobs on every push/PR to main: the JS suite and a static parse
check, the Python suites, data validation, a determinism gate over two regenerations,
a Jekyll build for Pages, and real-browser layout checks.
Browser checks. e2e/ holds Playwright specs that measure the layout a browser
actually produces, at 1440px and 390px, against the shipped CSS and JS. They assert
measurements rather than pixel baselines — a baseline needs a human to approve the
current appearance and then fails on every legitimate restyle — and CI publishes the
screenshots as artifacts for anyone who wants to look.
bun install
bunx playwright install chromium
bunx playwright testThe unit suite runs against a hand-written DOM fake, which is fast but cannot see a frame that is too tall or a legend that leaves its container. Both shipped once. The browser checks are what caught them.
Note: bun install under a newer Bun rewrites bun.lock in a format CI's pinned Bun
cannot read. Regenerate it with the pinned version; a test enforces this.
Listed in legend order. CATEGORY_LEGEND in assets/js/worldmap.js is the authority.
🧬 Biotechnology & Biohacking — gene editing, implants, microscopy, longevity, synthetic biology, neuroscience, grinder/DIY biohacking 🧠 Computing & AGI — frontier models, agentic AI, GPU efficiency, benchmarks ⚛️ Quantum Physics — qubit counts, error correction, time crystals, supremacy, networking ⚡ Renewable Energy — fusion, solar efficiency, battery density, wind, storage 🚚 Mobility & Logistics — autonomy, freight, ports, rail, aviation, last-mile 🛡️ Cybersecurity — exploits, mitigations, encryption, threat intel, zero-days 🤖 Robotics & Drones — humanoids, manipulation, industrial and surgical robotics, and drone flight time, range, endurance and payload records 🚀 Spaceflight & Aeronautics — launch, payload, deep space, hypersonic, reusability 🌍 Military & Defense — range, radius, fleet movements, contracts, air defense, naval, cyber ops
Biotechnology & Biohacking is one category drawn in two colors, not two categories.
80+ RSS feeds → LLM scoring → milestones.json → dashboard + Facebook
↑
self-healing source checker
Every 6 hours, transhumanists/apis runs the pipeline and commits new data here and to transhumanists/milestones.
| Repo | What |
|---|---|
| transhumanists | The organization — profile, dashboard SVG, cross-repo branding |
| transhumanists/milestones | Canonical milestone database (Markdown + JSON) |
| transhumanists/apis | RSS scraper, LLM scorer, Facebook poster, self-healer |
| transhumanists/transhumanists.github.io | This dashboard site |
All SVGs across the transhumanists, FrenzyPenguin Media, and neohiro readmes/profile pages share a uniform design system: dark background, JetBrains Mono + Space Grotesk typography, color-coded category dots, and a tiny FrenzyPenguin Media watermark in the bottom-right corner that links back to frenzypenguin-media.github.io.
Made with ♥ by FrenzyPenguin Media — a neohiro project.
- 💖 Sponsor neohiro on GitHub — cover API + hosting costs
- 🌐 neohiro.github.io — main site
- 🎬 FrenzyPenguin Media — video deep-dives