← 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)} />;
}