Honest framing: This tool shows 4 snapshots: 2026-01, 2026-02, 2026-03 (synthetic plausible projections of what the graph might have looked like at those past milestones) and 2026-04 (real, loaded from graph.json). The browser cannot run git log to reconstruct true history, and Nexus does not yet keep versioned graph snapshots in-repo. The earlier snapshots are derived deterministically from the current graph by group-introduction order, so node identity and edge structure are real — only the timing of when each concept was added is synthetic. A production temporal graph would either persist versioned snapshots as separate files (e.g. graph-2026-01.json) or expose a backend timeline API.
2026-04
Loading…
Speed

Snapshot Stats

0
Nodes
0
Edges
0
Domains
0.0
Avg edges / node

Group Composition

Loading…

What Changed

Move the slider to compare snapshots.
Drag to pan. Scroll to zoom. Click a node for details. Nodes that exist in the current snapshot appear at full opacity; those that haven't been introduced yet are dimmed near-invisible (so the layout stays stable across snapshots).
Loading…

Concept Lineage

Pick a concept. The tool shows three relationships derived from the milestone data: the snapshot in which the concept was first introduced, its siblings (other concepts added in the same milestone), its prerequisites that already existed at that point, and the downstream concepts that now depend on it (added in this or later snapshots).

How the Snapshots Are Built

The tool defines an introduction order for the ~45 group codes used by Nexus (T01..T35 plus the named groups like cloud, appsec, purple-team, etc.). Each milestone admits the next slice of groups:

  • 2026-01 Foundations + early telemetry/detection: T01, T02, T03, T04, T05
  • 2026-02 Add threat intel, IR, ops, pentest, network, crypto: T06..T16
  • 2026-03 Add IAM, mobile, cloud, container, vuln, appsec, architecture, data, recovery, hunting, modeling, identity, devsecops: T18..T35
  • 2026-04 Current: all named groups (attack, blog, cloud, concept, scenario, tool, etc.)

Edges are filtered at each snapshot — an edge is included only if both its endpoints exist at that point. So at 2026-01 you see a small dense Foundations cluster; by 2026-04 you see the full 543-node web. Layout is computed once on the full 2026-04 graph so positions stay stable as you scrub — only opacity changes.

Force simulation

Same approach as skill-tree-viz.html: spatial-bucket Coulomb repulsion (only compares nodes within 3x3 grid cells) + Hooke spring along edges + gravity toward center, ~250 ticks of synchronous integration on boot. No D3, no vis.js, no Cytoscape.

What's real vs synthetic

Real: the 2026-04 snapshot, every node ID/label/group/url, every edge, the layout positions. Synthetic: the dates 2026-01 / 2026-02 / 2026-03 and the assignment of which group "appeared" in which milestone. Treat the timeline as a didactic projection, not a git-log replay.

Production version

To make this real: write a scripts/snapshot_graph.py that runs in CI weekly, committing docs/learning-graph/snapshots/graph-YYYY-MM-DD.json. The HTML would then fetch a snapshots/index.json manifest and load each real snapshot. That work is out of scope for this PoC — the loop is illustrated here with derived snapshots.