Skip to content

v2.68.28

Choose a tag to compare

@github-actions github-actions released this 04 Oct 19:47
Immutable release. Only release title and notes can be modified.
0da8b05

Static shell follow-ups

  • Agent skill SKILL.md routes are prerendered. generateStaticParams reads the agentSkills registry, so the route moves from ƒ to ● (browse-llms-txt, markdown-negotiation, music-and-albums). Known skills return the same headers and body as before. Unknown names still return 404 "Not Found", but that 404 is now cached as an on-demand static fill (s-maxage=31536000, cleared each deploy), because Cache Components drops the dynamicParams opt-out.
  • OG and Twitter images are static (○, 30d / 1y). The edge runtime is gone. ImageResponse loads its renderer and fonts with uncached I/O while it streams, so the finished PNG is now rendered inside 'use cache' with cacheLife('max'). Fonts load from disk with readFile. Both routes share one render path.
    • Visible change: the outer band is now the dark teal the JSX specifies (hsl(183deg, 92%, 10%, 1)) instead of black. The edge renderer misparsed that four-argument hsl() as black; Node renders it as written. Text and logo differ by at most 1/255.
  • Not included: favorite-albums grid in the static shell. The design works: all 102 tiles land in the prerendered HTML, and click, close, and no-JS deep links work. But on 16.2.10, a JS deep link to ?album= throws React insertBefore and hydration #418 errors. That's vercel/next.js#94670: partial-prerender resume reuses segment ids, so the swap script moves the wrong content. It's fixed upstream in React, and stable Next is now 16.3.8. The work is parked locally as 8fc9e0bf and can land after the Next upgrade.

Collage without MUI, plus LCP priority

  • Collage-only components no longer import MUI. The dev-console lede is a <p>, the album-card skeleton is plain CSS, and RecordDisc uses <a>. Shared code keeps MUI.
  • Collage LCP images get fetchPriority="high". The album well image is also preloaded, and the first listening-history stack loads eagerly. All of this is gated on surface === 'collage'.
  • generateSizesString now lists (max-width) entries narrowest first, with the fallback last. Before, the fallback came first, so it matched at every viewport. This also changes classic sizes attributes, and that is the only classic prerender difference.
  • PaperButton renders API routes and other origins as plain anchors with aria-label, so the router no longer prefetches OAuth redirects.

Measured on #616 head 5ca5a3fe with Lighthouse mobile, median of 3 runs:

Page Observed LCP LCP discovery checks
Album 427 → 245 ms 0/3 → 3/3
Music 83 → 64 ms 1/3 → 3/3
Home 63 → 72 ms (noise) 2/3 → 3/3

Simulated LCP and the perf score are flat. JS is also flat (+0.7–0.9 KB gzip), because shared components still load the MUI chunk.

Visible change: the dev-console link-style PaperButtons now use the declared .paperButton type instead of MUI body1. They match the button-style PaperButtons and are about 17 px shorter.

Dev console before (base)
Dev console after (head)

Tests

  • skillMdRoute.test.ts checks that every registry skill is prerendered and served as markdown. createSocialImage.test.ts checks that the PNG renders with both brand fonts loaded from disk. Image.test.ts covers the narrowest-first sizes order.
  • On the combined branch, pnpm exec turbo check:ci check:types test passes 26/28 locally. The two DB-backed suites (@dg/services, @dg/web) can't run in this VM because DATABASE_URL_TEST isn't set, so CI covers them.