Skip to content

WIP: Redesign livepeer.org - #93

Draft
adamsoffer wants to merge 8 commits into
mainfrom
claude/livepeer-redesign-plan-110a98
Draft

WIP: Redesign livepeer.org#93
adamsoffer wants to merge 8 commits into
mainfrom
claude/livepeer-redesign-plan-110a98

Conversation

@adamsoffer

@adamsoffer adamsoffer commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

🚧 Work in progress — not ready to merge. Opened as a draft for review of direction and shape. See Before this can ship for the blocking items.

Rebuilds the marketing site against Peace Node's Livepeer UI registry. The registry theme is now the only token layer.

Pages

Nine linked pages, all built from the mockup set except where noted:

Page Route Notes
Home /
Agent /agent flagship product surface
Ecosystem /ecosystem /[slug], /submit — markdown-driven catalog
Provide GPU compute /compute one page for running + earning
Token /token
Foundation /foundation
Latest /blog nav says "Latest", URL stays /blog
Brand /brand no mockup — designed from design.md + registry Foundations
Roadmap /roadmap no mockup — built from the requirements doc

/primer stays intact and unlinked with its own scoped legacy slice — the one page deliberately left unmigrated.

Content is split on its shape and how often it changes. Page copy is authored in-repo as typed objects matching the registry's content contracts (lib/site.ts) — versioned and reviewed alongside the design it belongs to. Blog and ecosystem are markdown in content/.

Templated content that gets updated frequently moves to Notion, and the roadmap register is the first of it. It is maintained by people across several organisations who do not open pull requests, and a commitment whose state is a week stale is worse than no page at all. The blog is planned next; scope is those two for now, not a general move of the site into a CMS. So this PR is the pattern as much as the page. lib/notion.ts reads it over plain fetch with ISR at a minute; content/roadmap/*.md is the fallback when no workspace token is present, so a clone still builds. Every record carries an owner, a target and a checkable link, and anything missing one fails the build rather than rendering a card that claims less than it should.

Cleanup

globals.css 1209 → 585 lines. Removed the second --color-* token layer, the Holographik grid, hero classes, .blog-prose, 19 keyframes and 37 custom properties. Chart/sidebar/radius tokens are kept — unused today, but they're the registry's theme contract.

Deleted ~73 files: components/home/*, components/legacy/*, components/ecosystem/* (superseded by components/livepeer-ui/*), the PascalCase components/ui/* visuals, lib/constants.ts, and the five app/use-cases/* routes — redirects in next.config.ts already served those URLs, so the pages were unreachable.

Share images

Rebuilt on the registry's own og item. / renders the brand card verbatim — the lockup centred on #000000. Every other page renders the same canvas with a page title, from one shared lib/og.tsx. Two bugs fixed along the way:

  • Only the root had a twitter-image, and metadata files cascade — so /foundation and /blog served their own og:image but the root's Twitter card. Every segment now has a re-export beside its opengraph-image.
  • Ecosystem project pages had no share image at all: their generateMetadata declares an openGraph object without images, which drops the inherited card. All 12 projects now get their own titled card.

Incidental fixes

  • app/not-found.tsx styled its link text-green — green as an affordance colour, which the design system explicitly rules out. Rebuilt on the registry type scale.
  • sitemap.ts advertised the five dead /use-cases URLs and never listed /agent or /compute. Rewritten, with ecosystem projects added.
  • Instrument Serif was downloaded on every page load with zero consumers. Removed.
  • package-lock.json deleted. Six deps had been added via npm in a pnpm-pinned repo, leaving pnpm-lock.yaml stale — pnpm install --frozen-lockfile was failing, which would have broken the Vercel build. Lockfile regenerated and verified.

Verification

pnpm typecheck, pnpm lint (0 warnings) and pnpm build (130 static pages) all clean, against both the Notion register and the markdown fallback. Pages verified in light and dark at 390px, sm, md and wide desktop.

Before this can ship

  • agentAppOrigin is the console's Vercel preview (lib/site.ts) — livepeer-console.vercel.app, not its final address. It feeds the most prominent CTA on every page, so it still needs one edit before launch. The Agent playbooks link is the one product link left on livepeer.peaceno.de: the console has no playbooks page, and a mockup beats a 404.
  • Blog art hotlinks Peace Node's Sanity CDN — confirm permanence or vendor the assets.
  • Placeholder people in the register. Names, portraits and rosters are stand-ins except Doug Petkanics. Replacing them is a Notion edit, not a deploy.
  • Commitment links mostly cite venue roots — 11 of 19 point at forum.livepeer.org/ or similar rather than a permalink.
  • The Notion webhook is not subscribed yet — needs an integration admin and the production domain. Until then the one-minute window is what carries edits to the site, which is sufficient but serves one stale reload.

🤖 Generated with Claude Code

@vercel

vercel Bot commented Aug 8, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated
website Ready Ready Preview Sep 7, 2026 8:13pm UTC

Request Review

@adamsoffer adamsoffer changed the title WIP: Redesign livepeer.org on the Livepeer UI design system WIP: Redesign livepeer.org Aug 8, 2026
adamsoffer and others added 8 commits September 6, 2026 12:11
Peace Node's registry theme becomes the only token layer. The hand-rolled
--color-* system, the Holographik grid, the hero classes, .blog-prose and
seventeen bespoke keyframes go; globals.css keeps the type scale, the two
theme roots, the prose classes and four live keyframes. The primer keeps
its own scoped slice, deliberately unmigrated.

The shell is the registry's: header (sticky, transparent at rest, glass on
scroll, with opt-ins for sections that need it solid, inverted or glass
from rest), footer, theme toggle, brand marks, and the shadcn primitives
the pages compose. Page content is authored in-repo as typed objects
matching the registry's content contracts, with the Sanity client stubbed
by a static module the header expects. Share images render the registry's
og card, one per segment with a twitter-image beside it.

The legacy home, layout, blog and ecosystem components, the PascalCase
ui/ visuals, the five use-case routes and their images are deleted; the
redirects in next.config.ts serve those URLs. Discord is read live from
the server's widget (lib/discord.ts) after discord.gg/livepeer was taken
over, with livepeer.org/discord as the one owned URL for content.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Copy stays in the repo. Content that is many records of one shape,
maintained by people on their own schedule, moves to Notion: the roadmap
register, the blog and the funding ladder. lib/notion.ts reads the
databases over plain fetch and maps them onto the same types the markdown
readers produce, enforcing every rule those readers enforced; a Notion
failure with a token throws rather than serving stale markdown as if it
were current. lib/register.ts picks the source: Notion when NOTION_TOKEN
is set, content/*.md when it is not, so a clone without a workspace
credential still runs. A webhook and a revalidate route let an edit reach
the site within a minute without a deploy.

The ecosystem catalogue stays as markdown with YAML frontmatter and a
live contributor template, with its URL check kept in CI.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
/roadmap is the register of commitments, built from the requirements doc
with no mockup: cards by quarter, filters, credited faces, and a "Not on
the roadmap?" block that points at /contribute. Each commitment has its
own page, and an intercepting route slides it over the register as a
sheet; a record page mounted directly starts at the top.

Organizations and people are their own Notion databases, related from the
register so a name, portrait, owner and type are each stated once. They
render like a roadmap record and slide over the register the same way,
with no index. What an organization owns or a person worked on is derived
by filtering the register, never stored on them. Portraits are committed
under public/people; Notion holds a link to the same file.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The post is the Notion page body. The index reads metadata only and a
post reads its body, because twelve bodies fetched to render a list of
cards that show none of them is twelve wasted round-trips. Slug is an
explicit property, since a published URL gets quoted back; Author relates
to the people database; a post's art is its page cover, one image for the
card, the header and the share card, and a post without one fails the
build. Media in a body must be a link, never an upload: cdn.sanity.io
passes, a livepeer.org address is rewritten to the committed file and
checked, anything else fails. content/blog/*.md is the no-token fallback.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Replaces the Foundation's Grants & Funding Mechanisms page as the
canonical answer. The hero is a sentence and a Discord button with the
live online count beneath it, on a ground that is a contribution graph
drawn with vgpu: the grid a contributor's year is drawn on, four levels
of the brand green moving as a slow tide with a swell over it, colour
from the theme tokens, one still frame under reduced motion, a CSS mask
clearing the ground around the text, and an empty CSS grid beneath so a
browser without WebGPU shows an empty graph rather than a gap. The
section pulls up under the header, which wears its glass from rest.

The funding ladder is a Notion database, one row per way work gets paid
for, ordered by size, rendered as a hairline grid of cells: name, who it
is for, who decides and the ceiling as two labelled rows, and where to
go. Retired is a status, not a deletion. The page closes on the
contributors strip lifted from the old home page, twelve faces and a
count read live from spotlight.livepeer.dev with a dated snapshot as the
fallback. Footer-only: not in the header's Resources menu.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Home, Agent, Ecosystem, Compute, Token, Foundation and Brand are rebuilt
from the mockup set, each as typed content handed to registry sections.
Compute pulls live metrics; Foundation deliberately drops the three
pillars and the Messari block; Brand is designed from design.md with no
mockup and signed off.

The home page's Agent section shows the product being used rather than
its controls: an agent runtime, unnamed, where a prompt types in with a
still attached, the agent checks the network's capabilities, a
run_capability call goes out with a real capability, price and latency
read from the network, and a clip comes back. It plays once per entry
into view and holds on the finished state, fits the window without
scrolling, and shows the finished state still under reduced motion.
Built on ElevenLabs UI's Conversation, Message and Shimmering Text,
vendored into components/ui under MIT because the registry rate-limited
every install route.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The page was busy: bordered cards, tiles, a five-column table, copy
buttons on every row and a 740-line construction drawing. It is now a
product page at a centred 56rem measure. Each thing it has to say is an
object on a soft plate with a caption under it, and the copy is short.

The marks sit on an ink switch, black or white, expressed through the
theme's foreground/background pair so both inks stay honest in both
themes; the SVG links follow the switch. Every usage rule is a picture:
clear space drawn, the lockup at its 32px floor (the symbol shares the
wordmark's height there, so one object states both minimums; the
wordmark alone goes to 24px), and four small "never" plates, stretched,
rotated, outlined and recoloured, the last being the only green mark on
the site. Type specimens are editable in place, nothing saved, and the
scale is rendered at its own sizes instead of tabulated. The hero says
what the page is: Brand guidelines.

The construction diagram is deleted; the clear-space drawing is the one
figure the page needs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
One face for everything. Inter is self-hosted from Rasmus Andersson's
own distribution (rsms.me/inter, the 4.1 release): the InterVariable
build and its italic cover 100–900 in two files, with the licence beside
them. Geist Mono replaces Favorit Mono for code, paths, IDs, timestamps
and the small mono labels. Favorit Pro and Favorit Mono and their ten
files are gone, along with the display face they justified: the header's
full-screen menu and the share cards now set the same Inter as the pages.

`font-display` and `font-heading` stay defined as aliases of the sans so
a registry component that sets them still resolves. Satori cannot read
the variable woff2, so the share-image renderers use a static
Inter-Regular.otf from the same release. The brand page's type section
shows two faces; the kit's typography note and README follow.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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