withastro/astro · warning
Internal Warning: route cache overwritten. (${key})
Error message
Internal Warning: route cache overwritten. (${key}) What it means
RouteCache stores each route's getStaticPaths() result keyed by route+component and expects set() to run once. In production runtime mode it warns before overwriting an entry that already has staticPaths, because that means getStaticPaths (or route initialization) executed twice — the 'Internal Warning' prefix signals this is an invariant breach, normally triggered by integrations or an Astro bug rather than page code.
Source
Thrown at packages/astro/src/core/render/route-cache.ts:126
private runtimeMode: RuntimeMode;
constructor(logger: AstroLogger, runtimeMode: RuntimeMode = 'production') {
this.logger = logger;
this.runtimeMode = runtimeMode;
}
/** Clear the cache. */
clearAll() {
this.cache = {};
}
set(route: RouteData, entry: RouteCacheEntry): void {
const key = this.key(route);
// NOTE: This shouldn't be called on an already-cached component.
// Warn here so that an unexpected double-call of getStaticPaths()
// isn't invisible and developer can track down the issue.
if (this.runtimeMode === 'production' && this.cache[key]?.staticPaths) {
this.logger.warn(null, `Internal Warning: route cache overwritten. (${key})`);
}
this.cache[key] = entry;
}
get(route: RouteData): RouteCacheEntry | undefined {
return this.cache[this.key(route)];
}
key(route: RouteData) {
return `${route.route}_${route.component}`;
}
}
const routeCaches = createManifestMemo(
(manifest) => new RouteCache(getLogger(manifest), getEnvironment(manifest).runtimeMode),
);
/**View on GitHub (pinned to 52e6c34790)
Solutions
- Update Astro to the latest patch release in case the invariant breach is already fixed
- Audit integrations that invoke a second render/build pass and make them reuse one container and route cache
- If it reproduces with stock configuration, open an astro repo issue with the full build log and a minimal repro
Defensive patterns
Strategy: validation
Validate before calling
const existing = routeCache.get(route);
if (existing?.staticPaths) {
// reuse the cached entry; do not call set() again
} else {
routeCache.set(route, entry);
} Prevention
- In integrations, reuse one container/manifest instead of re-rendering routes
- Treat this warning as a build-hygiene signal and investigate the double pass
- Keep Astro patched so fixed internal regressions disappear
When it happens
Trigger: During a production build or SSR render, RouteCache.set() is called twice for the same route when the first entry already stored staticPaths — e.g. an integration spinning up a second render pipeline over the same manifest, or duplicated build state.
Common situations: Custom integrations that re-render routes or rebuild the app container; tooling that re-runs the render step over built output; rare Astro internal regressions across versions.
Related errors
- PageNumberParamNotFound
- PrerenderDynamicEndpointPathCollide
- Missing parameter: ${part.content}
- GetStaticPathsInvalidRouteParam
- [MDX] A remark or rehype plugin attempted to inject invalid
AI-assisted analysis of withastro/astro@52e6c34790 (2026-08-18).
Data as JSON: /api/errors/23fb5cce6eeb6654.
Report an issue: GitHub.