← Inbox

Message

Three stages on one route. Resolve chips stamp how long after navigation start each panel painted.

Shellin App Shell — instant on soft nav

cacheLife on message previews

Jordan Lee·Mon

Prefetchawait prefetch() — warm with prefetch={true}

Minutes feels right for preview text. Thread replies can stay minutes too so back/forward stays snappy.

Navigationawait navigation() — never in a prefetch
Jordan LeeMon

Minutes feels right for preview text. Thread replies can stay minutes too so back/forward stays snappy.

YouMon

Agreed. Short stale times would pull them out of the shell anyway — we want the stage APIs instead.

How the stages defer

import { prefetch as prefetchStage, navigation } from "next/cache";

async function PrefetchPreview({ id }) {
  await prefetchStage();          // out of shell; in per-link prefetch
  return <Preview data={await getCachedPreview(id)} />;
}

async function NavigationThread({ id }) {
  await navigation();             // only on real navigation
  return <Thread items={await getCachedThread(id)} />;
}