Skip to content

feat(foundation): new /foundation page#44

Open
adamsoffer wants to merge 19 commits intomainfrom
claude/relaxed-mccarthy
Open

feat(foundation): new /foundation page#44
adamsoffer wants to merge 19 commits intomainfrom
claude/relaxed-mccarthy

Conversation

@adamsoffer
Copy link
Copy Markdown
Collaborator

@adamsoffer adamsoffer commented Apr 15, 2026

Summary

Adds a new /foundation page. Copy is sourced verbatim from the source doc (Steph Alinsug, April 2026). The page is structured as an essay: hero with a serif display headline, followed by four numbered chapters, each with a thematic animated graphic.

What's in it

Hero

  • Serif display headline via new Instrument Serif font (lib/fonts.ts) paired with Favorit Pro for body
  • Venn-diagram graphic below the hero: two dashed overlapping circles, gradient "shooting star" comets revolving around each, diagonal stripes in the lens intersection with a small inset
  • Concentric arc geometry (radius 49.9 in a 100-unit viewBox) so the comets trace exactly along the dashed borders rather than floating inside

Four chapters01 The Network / 02 The Foundation / 03 What We Do / 04 The Team. Each has a numbered breadcrumb, serif chapter title, and (for 01–03) a thematic animated SVG banner between the heading and body. Team intentionally has no graphic — the roster of names is the section.

Graphic rationale

  • 01 The Network: distributed dot-grid with pulses traveling along connections (visualizes peer-to-peer network)
  • 02 The Foundation: same grid, but a ripple radiates from a centered anchor (reinforces Foundation as in-service-of the network, not above it)
  • 03 What We Do: three streams converging on a focal point — the Foundation's three practices (Strategy / Coordination / Support) flowing into one shared outcome
  • 04 The Team: no graphic — names carry the section

Nav & Footer

  • Added Foundation to the Resources dropdown in NAV_ITEMS (lib/constants.ts)
  • Added Foundation to the Resources column in the global Footer

Test plan

  • Hero text is vertically centered in the viewport; serif headline renders at large sizes
  • Hero Venn graphic: two comets revolve exactly along the dashed circle borders (not inside)
  • Lens intersection shows diagonal stripes with a small padding inset from the arc edges
  • Each chapter's graphic renders and animates on scroll-into-view
  • /foundation is reachable from the Resources nav dropdown and Footer
  • "Read the original announcement" navigates to /blog/introducing-the-livepeer-foundation without opening a new tab
  • Responsive: hero + chapter graphics render acceptably at mobile, tablet, and desktop widths

🤖 Generated with Claude Code

@vercel
Copy link
Copy Markdown

vercel bot commented Apr 15, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
website Ready Ready Preview, Comment Apr 16, 2026 2:40am

Request Review

@adamsoffer adamsoffer changed the title feat(foundation): rebuild /foundation page as Linear Method–style essay feat(foundation): new /foundation page Apr 15, 2026
adamsoffer and others added 3 commits April 15, 2026 12:02
Rebuilds the /foundation page from scratch using Linear Method's essay
format as heavy inspiration. Copy is sourced verbatim from the doc
brief (Steph Alinsug, April 2026): hero + four chapters (About The
Network, About The Foundation, What We Do, The Team).

Hero:
- Serif display headline (Instrument Serif, added to lib/fonts.ts)
  paired with Favorit Pro for body
- "Coordinating the ecosystem" centered in a full-viewport hero
- Venn-diagram graphic below: two dashed overlapping circles with
  stroked gradient "shooting star" comets revolving around each,
  diagonal stripes in the lens intersection with a small inset
- Concentric arc geometry (radius 49.9 in 100-unit viewBox) so the
  comets trace exactly along the dashed borders

Chapters:
- Each chapter has a numbered breadcrumb (01–04), serif chapter title,
  and (for 01–03) a thematic animated SVG banner sandwiched between
  the heading and body prose
- 01 The Network: distributed dot-grid with connection pulses
- 02 The Foundation: same grid with a ripple radiating from a centered
  anchor (visual echo to reinforce Foundation as in-service-of-network)
- 03 What We Do: three streams converging on a shared focal point,
  viewBox widened to 800×200 so streams span the full text-column width
  while keeping circles perfectly round (preserveAspectRatio="xMinYMid
  meet")
- 04 The Team: no graphic — the roster of names carries the section

Nav + Footer:
- Added Foundation to Resources dropdown in NAV_ITEMS (lib/constants.ts)
- Added Foundation to the Resources column in the global Footer

Internal link:
- "Read the original announcement" now points to /blog/introducing-
  the-livepeer-foundation (internal) rather than external blog URL

Other:
- Resolved stray merge-conflict markers in pnpm-lock.yaml

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Next's lint rule disallows bare `<a>` elements for internal navigation.
Swap the "Read the original announcement" anchor for `<Link>` from
`next/link` to resolve the build error.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Updated the Foundation graphic's viewBox from 760×200 to 768×200 and
gapX from 34 to 38.4 so the dot grid spans edge-to-edge, matching the
width of the body text below it like the other section graphics.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
CI was failing with ERR_PNPM_OUTDATED_LOCKFILE after my earlier
merge-conflict resolution left the lockfile slightly out of sync
with package.json. Running pnpm install regenerates the missing
entries; verified passing with pnpm install --frozen-lockfile.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
The center anchor in the Foundation graphic now follows the cursor,
and nearby dots light up green based on proximity (linear falloff
within an influence radius of 110 viewBox units). When the mouse
leaves the graphic, the anchor glides back to center and the dots
fade to their idle dim-white state.

Internals: converts client-coords to SVG-local coords via
svg.createSVGPoint() + getScreenCTM().inverse() so the interaction
works correctly regardless of the graphic's rendered size. Anchor
uses a translate() transform with a cubic-bezier transition for a
calm follow, and dots transition fill + radius over 180ms so the
highlight feels continuous rather than jittery.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
When the mouse is over the graphic, moving in any direction emits a
cascade wave that travels from the cursor in the direction of motion
at 900 viewBox units/sec, lighting dots in sequence all the way to the
end of the grid. The wave has a perpendicular band of 95 units and
each dot fades back to idle over 900ms after the wave passes. The
center anchor still follows the cursor with a smooth translate.

When the mouse is NOT over the graphic, the graphic returns to its
prior idle state: a radial ripple sweeps outward from the center via
per-dot CSS animation delay, and the anchor breathes in place at the
origin. Implemented by swapping the dot's style between an inline
computed fill (hovered) and a CSS keyframe animation (idle).

A RAF loop ticks re-renders while a wave is active so intensities
animate smoothly; it auto-stops once the wave has traversed the grid
diagonal + fade duration.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
02 Foundation:
  Reverts the mouse-interactive cascade and removes the center anchor
  circle entirely. Returns to the original radial ripple from the
  geometric center (per-dot CSS animation delay based on distance from
  origin). No moving anchor.

01 The Network:
  Improves visual richness:
  - Lattice density bumped to 13×5 (from 11×5)
  - Quiet background mesh of subtle short edges between scattered node
    pairs (5% white, gives the lattice underlying structure)
  - 8 multi-hop "packet" routes, each a chain of 3–5 nodes joined by a
    single SVG path. A short bright green dash (length 14) animates
    along each path with stroke-dashoffset, so a packet visibly hops
    from node to node along its route.
  - Faint base lines drawn under each route at 12% opacity so the
    routing pattern is still visible when no packet is mid-flight.
  - Highlighted node count expanded to 15, distributed across the grid.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
adamsoffer and others added 9 commits April 15, 2026 17:26
Replaces the multi-hop packet routing concept with a layered neural
net composition that better conveys the connection between nodes.

- 4 layers of nodes (4 / 6 / 6 / 4 = 20 nodes) arranged as columns
- Every node in each layer fully connects to every node in the next
  layer (24 + 36 + 24 = 84 connections)
- All connections drawn as faint static white lines (7% opacity) so
  the wiring is always visible — the network's structure reads at
  rest, not just during animation
- Each connection has its own continuous activation pulse: a short
  bright green dash traveling along the line over 4.2s, with delays
  staggered across all 84 connections so ~10–15 are mid-flight at any
  moment, mimicking activation propagation in a neural net
- 7 nodes highlighted with a green halo to suggest "active" GPUs
- Node radius bumped to 2 (3 for highlighted) so they read clearly
  against the dense connection mesh

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Rejected the neural-net direction because it was conceptually wrong:
neural nets are layered/directional/hierarchical, but Livepeer is a
flat distributed P2P mesh of equal peers with no center.

Rebuilt from first principles:

  • Nodes laid out via a perturbed grid (deterministic seeded RNG)
    so the constellation looks organic rather than columnar.
  • Each node connects to its 3 nearest neighbors — a real mesh
    routing graph, not bipartite layers between fixed columns.
  • Mesh edges drawn at very low opacity (5% white) so the structure
    is visible at rest without dominating; the pulses do the talking.
  • 14 ephemeral peer-to-peer pulses traverse random edges in either
    direction (random reverse flag per pulse) on staggered delays
    and durations, so traffic feels organic and never synchronized.
  • 6 highlighted nodes scattered around the constellation suggest
    "active GPUs" without imposing a hierarchy.

The graphic now visually reads as: a global constellation of
independent peers exchanging work locally with their neighbors —
which is what the section copy actually describes.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Implements the post-launch polish suggestions:

  • ChapterNav: fixed vertical thread on the right side of the viewport
    (desktop only). 4 dots — one per chapter — connected by a thin
    static spine for visual continuity. Dots are clickable (smooth-
    scroll to chapter) and the active chapter highlights green with
    its label visible. Uses IntersectionObserver to detect which
    chapter is currently in the user's reading zone (rootMargin
    -30% / -50%).

  • Hero arrival staggered: eyebrow / headline / lede now animate in
    individually with 0 / 80 / 180 ms delays. Feels more composed
    than the previous all-at-once fade-in.

  • Italic emphasis on the conceptual heart of "About The Network":
    "owned and run by its participants" is now wrapped in a serif
    italic span. The phrase carries the section's thesis and now
    visually carries the weight too.

  • Colophon: small bookend at the bottom of section 04 — Livepeer
    symbol + "THE LIVEPEER FOUNDATION" in a hairline. Gives the page
    a sense of completion as a finished artifact.

  • Network graphic alignment: viewBox widened from 760×200 to
    768×200 to match the max-w-3xl text column aspect exactly.
    Column gap bumped to 76.8 so the constellation's leftmost and
    rightmost base nodes sit at the viewBox edges. Anchored
    xMinYMid so the mesh aligns flush with the prose's left edge.

  • data-chapter attributes added to all four chapter sections so the
    nav can observe them without prop drilling.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Two fixes for the 01 Network graphic:

  • Edge-clipping fix: the previous gapX of 76.8 with ±15 jitter could
    push edge nodes to viewBox x = ±399, just past the ±384 bounds, so
    the rightmost (and leftmost) nodes/edges were being clipped by the
    parent overflow:hidden. Tightened to gapX=72 with ±18 jitter so
    the maximum jittered range is ±378 — comfortably inside the ±384
    viewBox with a tiny 6-unit safety margin.

  • Seed picked for aesthetics: sampled five seeds (0x4c2b, 0x9e7f,
    0x2d8a, 0x6b1c, 0x8f55) and chose 0x2d8a — produces the most
    evenly triangulated mesh with no clusters or gaps, dense enough
    to read clearly as a connected network.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
The hero + Venn graphic + chapter 1 had too much vertical air on mobile:

  • Hero was min-h-screen (812px on iPhone), but the centered text
    only filled ~500px, leaving a big gap below the lede before the
    graphic peeked.
  • Each chapter section had py-28 (112px top padding) on mobile, so
    the "01 / The Network" sat 112px below the bottom of the Venn.

Adjustments:
  • Hero: min-h-[78vh] on mobile, min-h-screen on lg+. The shorter
    mobile hero pulls the Venn closer to the lede, and on phones the
    hero text + graphic + start of chapter 1 now all fit in one
    viewport.
  • Chapter sections: py-14 lg:py-40 (was py-28 lg:py-40). Halves the
    mobile padding while keeping desktop spacing untouched.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
03 Work graphic — comets now travel the full path:
  • Comets start at the left of each stream and travel horizontally
    to x=700, then bend diagonally up/down into the focal node at
    (760, 0).
  • Per-stream keyframes computed so motion is uniform-speed across
    both segments (90% of duration is travel, 10% is post-arrival
    fade).
  • Comets get "subsumed" by the focal node: at the moment of arrival
    they begin a 0.4s scale-down (1 → 0.2) plus opacity fade
    (1 → 0), so the visual reads as the comet collapsing into the
    pulsing focal.
  • Replaced the directional rect+circle pulse with a single
    omnidirectional glowing dot (head + halo), which works cleanly
    when the comet bends along the diagonal segment.

Chapter graphic mobile spacing:
  • Graphic height: 180 → 220 px on mobile (200 unchanged on lg+)
  • Margin above (heading bottom): mb-10 → mb-6 on mobile
  • Margin below (graphic bottom): mb-10 → mb-6 on mobile
  Result: graphics feel more present and the body text sits closer.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Previous implementation used a rigid <rect> rotated to the diagonal
angle. Problem: the rect can't bend, so during the diagonal segment
the trail extended off the track into empty space.

Replaced with a stroke-dashoffset animation along an SVG <path> that
includes both the horizontal stream and the diagonal hand-off into the
focal node. The "comet" is a 70-unit dash that travels along this
path; because it's drawn on the path itself, it bends naturally at
the corner — always sitting on the track like a railroad car.

Two layered <path> strokes give the comet a halo + bright core look
(width 6 green halo + width 2.4 white core, both following the same
dash animation). Opacity fades to 0 at 100% so the comet appears
absorbed by the focal node when it reaches the end of the path.

Also: chapter graphic mobile sizing now uses aspect-[19/5] instead of
fixed h-[220px], so the container height matches the SVG content's
aspect ratio — eliminating the empty vertical space that made the
graphics look skinny on mobile.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Reintroduces the comet look (bright white head + glowing green trail)
while keeping the path-aware trail that bends with the track:

  • Trail: two layered <path> strokes — width 7 soft halo + width
    2.5 brighter core — both with stroke-dashoffset animation along
    the stream's path. The dash naturally follows the corner from
    horizontal to diagonal.
  • Head: a single bright white circle, animated with SVG
    <animateMotion> along the same path. keyTimes synced with the
    trail dash (0/0.06/0.9/1) so the head sits at the leading edge
    throughout, including across the bend.
  • workHead keyframes fade the head in and out in sync with the
    trail's opacity, so the whole comet appears, travels, and
    dissolves into the focal node together.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Work graphic comet tail now uses 20 stacked stroke layers with
aligned leading edges and a color ramp that mirrors the deployed
linearGradient (0% transparent green → 60% green(0.6) → 100% white),
capped by a crisp 7px white head node. Composited opacity falls
smoothly from head to tail with no visible banding.

Proportions tuned to match the deployed rect+circle look:
  • tail length 80, width 4 (matches the 80×4 rect)
  • head node diameter 7 (matches the r=3.5 circle)
  • green→white interpolation over the last 40% of the tail

Motion remains path-based stroke-dashoffset along straight-cornered
tracks, so the trail bends exactly at the hand-off into the focal
without losing shape.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Moves Documentation to the bottom and places Foundation directly above
Brand, in both the header nav dropdown (lib/constants.ts) and the
footer Resources column (components/layout/Footer.tsx).

Final order: Primer, Blog, Foundation, Brand, Documentation.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Adds a dedicated opengraph-image.tsx for /foundation matching the
site's standard OG format — centered Livepeer lockup, "The Foundation"
tagline, green accent line, and livepeer.org/foundation domain.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant