- readsnpm weekly downloads + OSV advisories
- becomesdownloads → mass; an advisory → charge
- writes
--w--cat - you seecore dependencies read heavy; one advisory turns its line red and the graph feels it
No canvas is drawn here — the field is invisible; these variables are its only output. Without it you would build: a dashboard query and alert rules.
field-ui · invisible fields · dependencies
Mass you inherit. Risk that travels.
@fundamental-engine/core has zero runtime dependencies — by design. The engine you
ship pulls in nothing. What's below is the build-time surface of this
monorepo's real package.json files — and even that carries inherited mass: every
package arrives with the weight of an ecosystem already moving through it, measured here as
weekly downloads.
Risk travels the same edges. An advisory against one external package spills downstream into every workspace package that inherits it — hover a dependency and threads run to the packages it touches; hover a workspace package and its full upstream chain lights. Toggle the field off and the same data collapses to a flat manifest.
size = weekly downloads — the mass the ecosystem already moves through each package · color = advisory state — red carries OSV records, blue is clean
- Aa size = the weighting signal
- advisory counts are historical — OSV records for the package name, not necessarily the pinned version
- hover a dependency → threads to the packages that inherit it; hover a package → its upstream chain lights
- Aa past 90 days without a publish, a row decays (dims)
- the soft glow = live density — the hidden
engine writes
--dto every row and node each frame; hover and it gathers, so the glow and the upstream chain light together
The workspace core → site
- core 0 internal deps
- platform 1 internal dep
- vanilla 2 internal deps
- elements 3 internal deps
- react 2 internal deps
- site 3 internal deps
The build-time surface 9 external packages
- typescript v6.0.3
TypeScript is a language for application scale JavaScript development
205.8M weekly downloads - react v19.2.7 2 advisories
React is a JavaScript library for building user interfaces.
134.4M weekly downloads - @types/react v19.2.17
TypeScript definitions for react
121.1M weekly downloads - katex v0.17.0 5 advisories
Fast math typesetting for the web.
14M weekly downloads - mermaid v11.15.0 11 advisories
Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and
8.5M weekly downloads - remark-math v6.0.0
remark plugin to parse and stringify math
5.1M weekly downloads - rehype-katex v7.0.1
rehype plugin to transform inline and block math with KaTeX
4.9M weekly downloads - astro v6.4.5 17 advisories
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
3.1M weekly downloads - @astrojs/sitemap v3.7.3
Generate a sitemap for your Astro site
1.5M weekly downloads
How it's built
The graph is the monorepo's own package.json files, flattened into markup:
each workspace package carries its transitive upstream chain, each external dependency
carries the packages that inherit it. field-ui runs an invisible field over both zones and
the type carries the measurement — downloads as weight, advisories as charge. Two live
channels ride on top: the page's hidden engine writes --d (local particle
density) to every data-hot row and node each frame, and the scoped recipe's
attention lane writes an eased --field-attention — CSS turns both into a felt
glow and lift, and both go quiet when the field is off.
1 — the graph lives in data attributes
<!-- a workspace package: its full
upstream chain, precomputed -->
<li id="ws-site" data-hot
data-chain="ws-elements ws-core
ws-platform ws-vanilla">
<!-- an external dep: the workspace
packages that inherit it. The
downloads figure declares its
provenance as a measurement. -->
<li id="dep-mermaid"
data-body="attract"
data-strength="0.72"
data-feedback data-hot
data-uses="ws-site"
style="--w: 0.20; --cat: #ff6b6b;">
...
<span data-field-visual-for="#dep-mermaid"
data-field-visual-role="measurement">
<b>2.1M</b> <!-- weekly downloads -->
</span>
</li> data-uses— where this mass lands downstreamdata-chain— everything a package stands on, transitively--cat— red when OSV records exist, blue when cleandata-hot— opts into the live density gather: hover and--dclimbs toward 1data-field-visual-for— names the downloads figure ameasurementof its row
2 — causality spill is hover + geometry
// hover a dep → thread to each
// workspace card it touches
const a = centerIn(row, zone);
for (const id of row.dataset.uses.split(" ")) {
const node = zone.querySelector("#" + id);
node.classList.add("cited");
const b = centerIn(node, zone);
d += `M${a.x} ${a.y} C ...`;
}
// the thread color is the row's --cat:
// advisory-carrying deps thread red.
// hover a workspace node → no SVG,
// just light its data-chain upstream —
// while the engine's --d gathers under
// the cursor (data-hot), so the glow
// and the chain light together. One SVG overlay spans both zones; the cubic threads are drawn at hover time from live geometry, so reweighting never leaves stale lines.
3 — CSS reads mass, decay, and the live channels
.dp-name {
font-variation-settings:
'wght' calc(380 + var(--w) * 360);
}
.dp-row {
/* --d: live local density, written by the
hidden engine each frame; gathers on
data-hot hover. --field-attention: the
recipe's eased attention lane. */
--live: var(--d, 0);
box-shadow: 0 0 calc(var(--live) * 16px) -6px
color-mix(in srgb, var(--cat)
calc(var(--live) * 55%), transparent);
opacity: calc(0.58 + var(--w) * 0.42);
}
/* an advisory badge runs hotter as the
field gathers on its row */
.dp-adv {
box-shadow: 0 0 calc(var(--live) * 10px)
color-mix(in srgb, #ff6b6b
calc(var(--live) * 45%), transparent);
}
/* decay: no publish in 90 days */
.dp-row.stale { opacity: 0.5; }
The freshness lens reweights from publish dates; packages whose dates the registry
snapshot didn't report hold a neutral weight rather than faking one. The glow reads
--d and --field-attention — live writes, zeroed when the
field is off.
The download counts also refresh once per visit: ~4s in, the page
fetches each package's last-week figure from api.npmjs.org (partial success is fine —
rows the API misses keep their snapshot values), then the existing reweight path
re-normalizes --w against the fresh max and FLIP re-sorts through the
active lens. Once, deliberately — the figure is a weekly aggregate, and polling a
number that changes weekly would be theater.