Skip to content

Redesign livepeer.org - #93

Closed
adamsoffer wants to merge 178 commits into
mainfrom
claude/livepeer-redesign-plan-110a98
Closed

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

Conversation

@adamsoffer

@adamsoffer adamsoffer commented Aug 8, 2026 •

Copy link
Copy Markdown
Collaborator

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.

Open items

None of these block the merge; each is a content or configuration change rather than code.

  • agentAppOrigin (lib/site.ts) points at earlyaccess.livepeer.org, the console's own address. 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 Oct 13, 2026 1:34pm 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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From the Wayback Machine's index of livepeer.org and blog.livepeer.org
(748 page addresses), tested against the new site: the 2021 site's
locale prefixes (/en/primer, /ko/delegators) drop and resolve; the old
on-site docs go to docs.livepeer.org; /jobs/* and the Livepeer.tv pages
go home; retired page names (/about, /delegators, /orchestrators,
/grants, /pricing, /use-cases/*) go to their successors; the Ghost
blog's /rss, tag and author pages go to the feed and the index; and
/ecosystem/livepeer-studio, the one address that worked on the old site
and not this one, goes to the catalogue. What still 404s is nine old
Daydream posts and Ghost's API paths.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A stack of contributor faces set against the owner's name read as that
owner's people, and the register credits people from other bodies on
work an organisation owns (Rick Staa, of the Foundation, on Livepeer
Inc's network readiness). The card now reads "by Livepeer Inc led by
[face] Qiang Han": the one person to ask, named, with what they are to
the work. Contributors stay on the record, in their own row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines +1 to +5
---
title: Burn-Mint Equilibrium
outcome: Connect LPT issuance to network usage, so rewards follow demand rather than a fixed schedule.
workstream: Protocol
state: next
Comment thread app/sitemap.ts
Comment on lines +108 to +115
return [
...staticRoutes,
...ecosystemEntries,
...categoryEntries,
...blogEntries,
...changelogEntries,
...legalEntries,
];
adamsoffer and others added 3 commits October 12, 2026 12:07
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The card's credit goes back to its original shape, the owner and a face
with the name in a tooltip, but the face is the lead's rather than the
contributors', so nobody from another body reads as the owner's staff.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A monogram beside the owner's name read as a second, unexplained
badge, so a card whose lead has no photograph names the owner alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines +23 to +28
const { id } = await params;
if (!PAGE_ID.test(id) || !hasNotionCredentials()) {
return new Response(null, { status: 404 });
}
const file = await getNotionBlogCover(id).catch(() => null);
if (!file) return new Response(null, { status: 404 });

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines +3 to +28
/**
* A blog post's cover when it was uploaded into Notion rather than taken from
* the stock library.
*
* Notion signs an upload's link for about an hour, and a cover outlives that
* on the index, the post and every timeline it is shared to. So the site
* serves the image itself, from an address that carries a version
* (uploadedCover in lib/notion.ts): fetched fresh from Notion here, cached for
* good, and replaced by a new address when the cover changes. The image
* bytes, not a redirect, so next/image can optimize it like any other cover.
* Only covers of rows in Blog posts are served (getNotionBlogCover).
*/

const PAGE_ID =
/^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}$/i;

export async function GET(
_request: Request,
{ params }: { params: Promise<{ id: string; version: string }> }
) {
const { id } = await params;
if (!PAGE_ID.test(id) || !hasNotionCredentials()) {
return new Response(null, { status: 404 });
}
const file = await getNotionBlogCover(id).catch(() => null);
if (!file) return new Response(null, { status: 404 });
adamsoffer and others added 2 commits October 12, 2026 12:44
Getting involved is something a visitor comes looking for; the brand kit
is for the few who need it, and the footer serves them. Contribute gets
its share card's art as its thumbnail and "Propose work and get it
funded" as its line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The footer had no link to the product the site leads with, so Network
opens on Livepeer Agent (the header, which gives Agent its own item,
leaves it out of its Network menu). Brand moves beside Terms and
Privacy, which brings Resources back to six that read as one list.
"X / Twitter" is "X".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Faces component, its monogram helpers and the roadmap's tooltip
provider go with it; nothing else on the register used them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

adamsoffer and others added 6 commits October 13, 2026 00:04
Latest Updates shared Ecosystem's office photograph, and Roadmap's waves
sat beside Contribute's near-identical ones in the Resources menu (Peace
Node's note).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t screen

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
January to May 2026 had rows only because the monthly wrap-ups were once
written into them; with those moved to the blog they listed as five empty
months. An entry with no roadmap rows is now left out unless it has a
headline.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Between sm and lg the field wrapped but kept its 16rem width and auto
margin, stranded at the right of an empty line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… screen

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lished entry intros, bounded contributors fetch

- /api/notion-media serves only ids a page rendered: the link carries an
  HMAC keyed from the Notion token and the environment, checked before
  Notion is called, so random ids cannot spend the shared rate limit and a
  draft's link from a preview does not open on production.
- /api/notion-cover checks its version against the current cover and sends
  an out-of-date address on to the current one, instead of caching a new
  cover for good under an old version.
- getNotionEntryBody takes the published row where a Draft sits beside it,
  as getNotionEntries does.
- getContributors times out after five seconds, so a stalled endpoint
  reaches the snapshot instead of holding the home and Contribute renders.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@adamsoffer adamsoffer mentioned this pull request Oct 13, 2026
@adamsoffer

Copy link
Copy Markdown
Collaborator Author

Superseded by #126: the same code (identical final tree to 4551ec7), regrouped into 16 commits by theme for review. This PR and its branch stay as the full history, including the review threads.

🤖 Generated with Claude Code

This branch was successfully deployed

1 active deployment
Preview — 4551ec79 Deployed Oct 13, 2026 by vercel[bot]
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.

2 participants