Known Issues
Bugs discovered during the P3.7 dogfooding phase (building this docs site on GioJS). All three were fixed before the docs site shipped — per the project rule: “Any workaround is a bug to fix first.”
CORE-001layout.tsx files not discovered or appliedFixed
Symptom
Pages rendered without any layout wrapper. Root layout providing <html> was ignored, causing wrapWithDocument to add a duplicate <html> shell around the rendered content.
Fix
Added discoverLayouts() to router.ts (walks app/ collecting layout.tsx files keyed by URL prefix) and layout wrapping logic to ssr.ts. Layouts are applied outermost-first. wrapWithDocument is skipped when a root layout exists at "/".
Fixed in: P3.7
CORE-002revalidate = false produces cacheMaxAge = 0Fixed
Symptom
Pages with export const revalidate = false were never cached. In Next.js, false means "cache forever." In giojs-core, the expression false ?? 0 evaluates to false (JavaScript ?? only checks null/undefined, not falsy), which is coerced to 0 by JSON serialization. The Rust cache layer requires cache_max_age > 0 to store an entry.
Fix
Updated ssr.ts lines 123-124: cacheMaxAge: pageModule.revalidate === false ? 31536000 : (pageModule.revalidate ?? 0). 31536000 seconds (one year) is the standard "cache indefinitely" sentinel.
Fixed in: P3.7
CORE-003No server-side redirect support in getServerSidePropsFixed
Symptom
getServerSideProps could only return props (Record<string, unknown>). There was no mechanism to return a 301/302 redirect, making it impossible to implement root-level redirects (e.g., / → /docs/getting-started) without a workaround.
Fix
Added RedirectResult interface and updated getServerSideProps return type to Promise<Record<string, unknown> | RedirectResult>. ssr.ts now detects redirect returns with an isRedirect() type guard and returns an IPCResponse with status 301/302 and a location header.
Fixed in: P3.7