2026-02-14
Building the Scrollytelling Engine
A deep dive into how StageShell drives the scroll-driven editorial experience on the Nash-Tek home page.
Why scrollytelling?
The Nash-Tek home page is not a traditional landing page. It is a cinematic stage — a single pinned viewport where content phases in and out as the user scrolls. This pattern, sometimes called "scrollytelling," lets us tell a story with the pacing of a film while preserving the simplicity of a static document.
The StageShell architecture
Everything sits inside StageShell, a full-viewport container that is the
only scroll surface on the page. Window scroll listeners are banned — all
progress is derived from a single scroll offset normalized to [0, 1].
Each "beat" on the timeline gets a start and end range. When the scroll progress falls within a beat's range, that beat is active and its content fades in. When progress leaves the range, the content fades out.
Beat ranges and the timeline
The timeline is defined as a typed array of beat descriptors:
intro— the opening lockuptoc— mission briefing / table of contentscollage— layered parallax sceneportal— the black hole transitionsidekick— the "Sidekick" revealappsthroughsupport— content chapter beats
Each beat has an enter, active, and exit window. Overlaps between adjacent
beats create cross-dissolve transitions.
Cinematics and envelopes
The envelope() utility maps a progress value to an opacity/transform curve. It
takes a beat range, an easing preset, and returns a 0-1 value that drives CSS
opacity and transform. This keeps all motion math in one place and makes it
trivial to re-time the entire page by adjusting the beat map.
Performance constraints
All animations use transform and opacity only — no layout-triggering
properties. The result is consistently smooth 60fps scrolling, even on mid-range
hardware.
The scrollytelling engine was first introduced in S04 and has been refined through every slice since.