Repository navigation
v2.68.28
Immutable
release. Only release title and notes can be modified.
Static shell follow-ups
- Agent skill
SKILL.mdroutes are prerendered.generateStaticParamsreads theagentSkillsregistry, 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 thedynamicParamsopt-out. - OG and Twitter images are static (
○, 30d / 1y). The edge runtime is gone.ImageResponseloads its renderer and fonts with uncached I/O while it streams, so the finished PNG is now rendered inside'use cache'withcacheLife('max'). Fonts load from disk withreadFile. 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-argumenthsl()as black; Node renders it as written. Text and logo differ by at most 1/255.
- Visible change: the outer band is now the dark teal the JSX specifies (
- 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 ReactinsertBeforeand 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 as8fc9e0bfand 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, andRecordDiscuses<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 onsurface === 'collage'. generateSizesStringnow lists(max-width)entries narrowest first, with the fallback last. Before, the fallback came first, so it matched at every viewport. This also changes classicsizesattributes, 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.tschecks that every registry skill is prerendered and served as markdown.createSocialImage.test.tschecks that the PNG renders with both brand fonts loaded from disk.Image.test.tscovers the narrowest-firstsizesorder.- On the combined branch,
pnpm exec turbo check:ci check:types testpasses 26/28 locally. The two DB-backed suites (@dg/services,@dg/web) can't run in this VM becauseDATABASE_URL_TESTisn't set, so CI covers them.