The cheetah model
Update 31.10.2025 – mystery solved
There’s currently a mysterious model called cheetah available to select in Cursor.

A video by Leonard Schmedding mentioned the rumor (not spread – he would never do that) that this might be the soon-to-be-released Gemini 3.0.
That got my attention, because ever since version 2.5 I’ve been a fan of Gemini and all the related products (notebooklm.google.com, aistudio.google.com, etc.) and I have the Pro subscription.
So I pointed this model at a bug in this blog that Claude Sonnet 4.5 had been unable to fix for days – a bug that was preventing me from deploying this whole nextra blog contraption you’re currently looking at. cheetah needed a few minutes. Then it wrote this report, which I’m pasting here in full. Because the solution was, as so often, strikingly simple. No model had figured it out before. Neither had I, for that matter. What am I paying so much for AI for? It’s supposed to do the work and leave me the fun parts.
The “Theories” section in particular is amusing. That’s still from Sonnet 4.5, desperately searching for explanations. Same goes for the “Next Steps” section. That’s my tip, in passing: always have the AI write down everything it’s currently wrestling with. Don’t just document the result. (The result should, in theory, match the specification you gave the AI anyway.)
404 Bug – Debugging Documentation
Status: RESOLVED ✅
Date: 23.10.2025
Problem: After adding the Footer, all MDX pages return 404
Solution: Cache issue fixed by completely deleting the .next folder
🚨 IMPORTANT: ALWAYS run this before every test!
# 1. Kill ALL Node/npm processes
killall -9 node 2>/dev/null
# 2. Clear cache
cd /Users/tobiasbrendler/NodeJS/nextra && rm -rf .next
# 3. Only then restart
npm run devNEVER test without these steps! Old processes and cached data produce false results.
Symptoms
✅ Works (WITHOUT Footer):
- Server running on port 3000
- GET / 200 in 4.6s
- GET /qwen 200 in 38ms
- GET /impressum 200 in 21ms
- All pages served correctly
- Terminal shows:
○ Compiling /[[...mdxPath]] ...
❌ Does NOT work (WITH Footer):
- Server running on port 3000
- GET / 404 in 4.8s
- GET /qwen 404 in 33ms
- GET /spec-kit 404 in 19ms
- Terminal shows:
○ Compiling /_not-found/page ... - Browser shows: “404: This page could not be found.”
The Core Problem: pageMap shows everything as undefined
In the working HTML (without Footer):
{"pageMap":[{"data":{"index":{"type":"page","title":"Home"},"howto-newblogpost":{...},"spec-kit":{...},"qwen":{...},"impressum":{...}}},...]}In the broken HTML (with Footer):
{"pageMap":[{"data":{"index":{"type":"page","title":"Home"},"howto-newblogpost":"$Y","spec-kit":"$Y","qwen":"$Y","impressum":"$Y"}},...]}"$Y" means undefined in React Server Components!
That’s why Next.js can’t find the pages – the pageMap has no information about the MDX files.
Attempted Solutions (all failed)
1. ❌ Simplify next.config.mjs
Attempt:
// From this version (with comments):
const withNextra = nextra({
// ... Add Nextra-specific options here
})
export default withNextra({
// ... Add regular Next.js options here
})
// To this version:
const withNextra = nextra({})
export default withNextra({})Result: No change, 404 remains
2. ❌ Move Search component back into Navbar
Attempt:
// Move Search out of Layout and back into Navbar
<Navbar pageMap={await getPageMap()}>
<a href="...">GitHub →</a>
<Search /> // ← Back here!
<ThemeSwitch />
</Navbar>
{children}
// <Search /> ← Removed from hereResult: Search is still visually at the bottom, 404 remains
3. ❌ Adjust mdx-components.js
Attempt:
// From:
const themeComponents = getThemeComponents()
export function useMDXComponents(components) {
return { ...themeComponents, ...components }
}
// To:
export function useMDXComponents(components) {
return getThemeComponents(components)
}Result: No change, 404 remains
4. ❌ Adjust app/[[…mdxPath]]/page.jsx
Attempt:
// From:
const Wrapper = getMDXComponents().wrapper
// To:
const Wrapper = getMDXComponents({}).wrapperResult: No change, 404 remains
5. ❌ Disable Turbopack
Attempt:
# In start-dev.sh:
# From:
exec node --require ./setup-polyfills.js ./node_modules/.bin/next --turbopack --hostname localhost "$@"
# To:
exec node --require ./setup-polyfills.js ./node_modules/.bin/next dev --hostname localhost "$@"Result: No change, 404 remains
6. ❌ next.config.mjs with options
Attempt:
const withNextra = nextra({
latex: true,
search: { codeblocks: false }
})Result: No change, 404 remains
Git History Analysis
Last working commit: 3bc8193 (bugfixes)
git show 3bc8193:app/layout.jsx # Works!
git show 3bc8193:next.config.mjs # Works!Current commit: c9dfb7a (improvements)
- Adds Footer
- Adds GitHub link in Navbar
- Moves Search component (accidentally?)
- Result: 404 on all pages
Diff between working and broken:
--- working (3bc8193)
+++ broken (c9dfb7a)
- import { Layout, Navbar, ThemeSwitch } from 'nextra-theme-blog'
+ import { Footer, Layout, Navbar, ThemeSwitch } from 'nextra-theme-blog'
<Navbar pageMap={await getPageMap()}>
+ <a href="https://github.com/Etschmia" ...>
+ GitHub →
+ </a>
- <Search />
<ThemeSwitch />
</Navbar>
{children}
+ <Search />
+ <Footer>
+ <a href="/impressum">Impressum</a>
+ {' | '}
+ <a href="https://github.com/Etschmia" ...>GitHub</a>
+ </Footer>Theories (not yet confirmed)
Theory 1: Footer component breaks rendering
- The Footer component might be interrupting pageMap generation
- Possibly a bug in
nextra-theme-blog/dist/components/layout.js
Theory 2: Search component position is critical
- Search must be INSIDE Navbar for correct routing
- Search OUTSIDE Navbar breaks pageMap generation
Theory 3: Layout structure problem
- The structure
<Layout><Navbar>...</Navbar>{children}<Search/><Footer/></Layout>is wrong - Correct structure should be:
<Layout><Navbar><Search/></Navbar>{children}<Footer/></Layout>
Theory 4: Timing/race condition
- Footer is rendered before pageMap is fully loaded
- getPageMap() returns undefined when Footer arrives too early
File State at Last Test
app/layout.jsx (CURRENT – BROKEN)
import { Footer, Layout, Navbar, ThemeSwitch } from 'nextra-theme-blog'
import { Banner, Head, Search } from 'nextra/components'
import { getPageMap } from 'nextra/page-map'
import 'nextra-theme-blog/style.css'
export const metadata = {
title: 'Blog Example'
}
export default async function RootLayout({ children }) {
return (
<html lang="de" suppressHydrationWarning>
<Head backgroundColor={{ dark: '#0f172a', light: '#fefce8' }} />
<body>
<Layout >
<Navbar pageMap={await getPageMap()}>
<a
href="https://github.com/Etschmia"
target="_blank"
rel="noopener noreferrer"
className="x:aria-[current]:no-underline x:aria-[current]:opacity-60"
>
GitHub →
</a>
<Search />
<ThemeSwitch />
</Navbar>
{children}
<Footer>
<a href="/impressum">Impressum</a>
{' | '}
<a href="https://github.com/Etschmia" target="_blank" rel="noopener noreferrer">
GitHub
</a>
</Footer>
</Layout>
</body>
</html>
)
}next.config.mjs (CURRENT)
import nextra from 'nextra'
const withNextra = nextra({})
export default withNextra({})start-dev.sh (CURRENT)
exec node --require ./setup-polyfills.js ./node_modules/.bin/next dev --hostname localhost "$@"Next Debugging Steps
1. Analyze Footer component source code
cat node_modules/nextra-theme-blog/dist/components/layout.js | grep -A 20 "Footer"2. Analyze Layout component source code
cat node_modules/nextra-theme-blog/dist/components/layout.js | grep -A 50 "export.*Layout"3. Test: Add Footer WITHOUT moving Search
<Navbar pageMap={await getPageMap()}>
<a href="...">GitHub →</a>
<Search /> // ← Stays in Navbar!
<ThemeSwitch />
</Navbar>
{children}
<Footer>...</Footer> // ← Only add Footer4. Test: Inspect Navbar props
// Add debug output:
const pageMap = await getPageMap()
console.log('PageMap:', JSON.stringify(pageMap, null, 2))5. Test: Step-by-step rollback
- Remove Footer → Does it work?
- Remove GitHub link → Does it work?
- Move Search back → Does it work?
6. Check: Other Nextra blog examples
- Look on GitHub for examples that have both a Footer AND working pages
- Compare their
app/layout.jsxwith our version
Terminal Output
✅ Working (without Footer):
▲ Next.js 16.0.0 (Turbopack)
- Local: http://localhost:3000
✓ Ready in 216ms
○ Compiling /[[...mdxPath]] ...
GET / 200 in 4.6s (compile: 4.4s, render: 167ms)
GET /impressum 200 in 21ms (compile: 6ms, render: 15ms)
GET /qwen 200 in 38ms (compile: 6ms, render: 32ms)❌ Not working (with Footer):
▲ Next.js 16.0.0 (Turbopack)
- Local: http://localhost:3000
✓ Ready in 209ms
○ Compiling /_not-found/page ...
GET /qwen 404 in 4.8s (compile: 4.7s, render: 94ms)
GET / 404 in 22ms (compile: 5ms, render: 17ms)
GET /spec-kit 404 in 19ms (compile: 5ms, render: 14ms)Note: /_not-found/page vs /[[...mdxPath]] – that’s the difference!
Known Issues (non-critical)
Watchpack Errors (macOS)
Watchpack Error (watcher): Error: EMFILE: too many open files, watchFix: Optionally increase with ulimit -n 10240, but not critical for the 404 issue.
uv_interface_addresses Error
NodeError [SystemError]: uv_interface_addresses returned Unknown system error 1Fix: Already resolved with --hostname localhost in start-dev.sh
Summary
Problem:
- Footer works on its own
- Pages work WITHOUT Footer
- Pages are 404 WITH Footer
- pageMap shows all pages as undefined (
"$Y")
None of the attempted solutions worked:
- ❌ Simplify next.config.mjs
- ❌ Change Search component position
- ❌ Adjust mdx-components.js
- ❌ Adjust page.jsx
- ❌ Disable Turbopack
The bug is stubborn and has a deeper cause!
Last Observation
In the HTML source code you can see:
<header class="x:mb-8 x:flex x:items-center x:gap-3 x:justify-end" data-pagefind-ignore="all">
<a href="/">Home</a>
<a href="/spec-kit">Spec-Kit und Cursor</a>
<a href="/qwen">Qwen Code</a>
<a href="https://github.com/Etschmia" ...>GitHub →</a>
<button ...>Toggle Dark Mode</button>
</header>The Search component is NOT being rendered in the Navbar!
That means my change in app/layout.jsx was either:
- Not saved
- Not picked up by the server (cache issue)
- Or being misinterpreted by the browser
Keep debugging with fresh eyes! The bug lives somewhere in the interaction between Footer, Layout, and pageMap generation.
✅ Solution
Problem identified: The layout itself was correct! The problem was a corrupt Next.js cache.
Solution:
- Kill all Node processes:
killall -9 node - Completely delete the Next.js cache:
rm -rf .next - Restart the server:
npm run dev
Result: All pages now work perfectly with Footer and GitHub link!
Commit: d8cddc1 – Footer now works correctly
Root cause: Next.js Turbopack had a corrupted cache that was interfering with pageMap generation. After a full wipe, everything worked again.