Template · Data & Infovis · v0.1

A scrollytelling shell for data, infovis, and edge-AI projects.

The narrative drives the visualization. As you scroll, the chart on the left morphs between states — provisioning, fleet activity, geographic distribution, anomaly detection. The same shell adapts to IoT telemetry, Arduino sensor data, infovis essays, or any project where the right way to read a chart is in sequence, not all at once.

Scroll-drivenSticky-viz patternReusableMobile-aware
How to use this template

Replace the STEPS array in the script with your own narrative. Each step has a state name; renderState() takes that name and morphs the visualization. The chart below uses an IoT fleet provisioning story as the example — swap in sensor data, model performance over time, deployment maps, or any sequenced argument.

IoT Fleet · Provisioning telemetry 01 / 06
Single device. Manual provisioning, ~14 minutes per unit.
01 · ORIGIN

It starts with one device.

A single edge device — a sensor, a router, a payment terminal — needs to come online. Manual provisioning takes 14 minutes: SKU lookup, network configuration, certificate install, activation handshake. Fine when you're shipping a handful. Catastrophic at fleet scale.

N = 1 · provisioning time 14m · success rate 96%

02 · SCALE

Now multiply by twelve thousand.

An enterprise IoT contract isn't ten devices — it's a fleet. 12,000 units across 240 sites, deploying over a four-month window. Manual provisioning would take 2,800 person-hours; the math fails before any of the interesting design problems show up.

N = 12,000 · sites = 240 · window = 16 weeks

03 · STATUS

Every device is in exactly one of four states.

The dashboard needs to show fleet posture at a glance. We modeled four states: provisioning, online, degraded, offline. Each gets its own color, but more importantly its own action affordance — degraded and offline route to different remediation flows.

States: 4 · semantic color · action-bound

04 · CHANGE OVER TIME

Posture only matters if you can see it move.

A snapshot of fleet status is useless. What the operator actually needs is the derivative — is the degraded count rising, are offline devices recovering, how does this week's rollout compare to last quarter's. Time-series became the primary view; the snapshot became a detail.

View: stacked area · 90-day rolling · 24h resolution

05 · GEOGRAPHY

Some problems are spatial.

A degraded cluster in one region is operationally different from the same count distributed across the country. The geographic view doesn't replace status or time — it complements them, and operators jump between all three depending on what they're trying to diagnose.

Small multiples · per-region rollup · drill to site

06 · ANOMALY

The point of the dashboard is to flag what shouldn't be there.

The last view layers anomaly detection on the time-series. Statistical bounds (rolling p95) define the expected envelope; deviations highlight in oxblood. The operator's first question — "is this normal?" — gets answered before they have to ask it.

Bounds: rolling p95 · alert threshold tunable

02 / PatternsRe-renderable through the same shell

Six chart patterns the template ships with.

Every chart answers a question. Every caption states the decision. The patterns below are the ones the scrollytelling shell uses; each can be re-rendered with different data without rewriting the scroll logic.

Distribution

Q.01 · QUANT

Question: how does this metric spread across the population?

Proportion

Q.02 · QUANT

Question: what share of the total falls into which category?

Change over time

Q.03 · QUANT

Question: is the derivative positive, negative, or noisy?

Correlation

Q.04 · QUANT

Question: does X move with Y, against Y, or independently?

Density / heatmap

Q.05 · QUANT

Question: where in this 2D space does activity concentrate?

Small multiples

Q.06 · QUANT

Question: how do parallel series compare side-by-side?

03 / WiringHow to extend

Three replaceable parts.

The template is intentionally small. Three things change between projects: the STEPS array, the renderState() function, and the chart's underlying dataset. Everything else — sticky behavior, scroll triggers, progress rail, mobile fallback — is shared infrastructure.

STEPS arrayEach entry maps a scroll step to a viz state name. Editable in 30 seconds.
renderState()Takes a state name + transition direction. One layer handles the morph; another handles the data join.
data sourceStatic JSON or live fetch. The template defers to whichever pipeline already exists.