Cursor builds whatever you prompt — which means your SEO is whatever you didn't prompt. These five checks catch what the AI silently decided for you.
Each one comes with a prompt you can paste straight into Cursor to fix it.
Cursor builds whatever you ask — and if you didn’t ask, it usually picks a client-rendered React SPA. That single early choice decides whether Google sees your content or an empty div. Most people discover this months later.
The fix: Check what you actually have: view your page source. If your content isn’t in the raw HTML, move the public pages to SSR or pre-rendering. Step by step: what SEO actually is — how Google works, in plain English.
Check how this project renders: if public pages are client-rendered only, add pre-rendering or server-side rendering for them (e.g. Next.js/Astro static generation, or vite-plugin-ssr/prerendering for a Vite SPA). Every public page must serve its full <title>, meta description, <h1> and main content in the raw HTML response.
"Vite + React + TS", "Create Next App", "index" — Cursor scaffolds ship with placeholder titles, and they end up as your Google listing. It reads as abandoned, and nobody clicks it.
The fix: Write a real title (≤60 chars) and meta description (≤155 chars) for every page. Step by step: how to add meta titles and descriptions in Next.js.
Find every page in this project and replace any placeholder or duplicated <title> and <meta name="description"> with real, unique, server-rendered text: title max 60 characters describing what the page is for, description max 155 characters that makes someone want to click. Use the site's own language.
Unless you asked for them, they don’t exist. That means slow discovery, missed pages, and no control over what gets crawled.
The fix: Generate both at build time so they stay in sync with your routes.
Add build-time generation of sitemap.xml (listing every public route with the production domain) and a robots.txt that allows crawling and references the sitemap. Use the framework's ecosystem tool if one exists (e.g. next-sitemap, @astrojs/sitemap); otherwise generate them in the build script. Verify both are served at the site root in production.
Vibe-coded sites accrete pages: a landing page here, a feature page there, half of them targeting the same search without you noticing. Google splits your ranking across the duplicates and none of them wins.
The fix: One search intent per page. Merge the overlaps, and give every important topic exactly one home.
List every public page and the search each targets. Where two pages target the same search, pick the stronger one, consolidate the content there, and 301-redirect (or link and de-optimise) the other. Where an important topic has no page, create one focused page for it with its own title, description and h1.
Pages built in separate Cursor sessions rarely reference each other. Internal links are how Google finds your pages and understands which ones matter — without them, deep pages are orphans.
The fix: Add in-body links between related pages with descriptive anchors.
Add internal links across this site: from the homepage to every key page, and 1-3 contextual in-body links between related pages using descriptive anchor text (not "click here"). Every important page should be reachable within two clicks of the homepage and linked from at least two other pages.
Run the free scan — it checks your Cursor site's foundations in 15 seconds and tells you what to fix first. Then connect Search Console for the full picture: which searches you're almost winning, and exactly what's holding you back.
Enormously. Server-rendered or statically generated output (Next.js, Astro, SvelteKit) serves Google full HTML by default; a client-rendered SPA serves an empty shell that Google may or may not render. If search traffic matters, that choice outweighs almost everything else.
View page source (not inspect element) and search for your headline. If it isn’t in the raw HTML, the page is client-rendered and Google can’t reliably read it. OptiSearch’s free scanner runs this check for you.
Vague prompts get vague results — Cursor will sprinkle meta tags and call it done. The prompts in this guide are specific about the outcome (server-rendered, per-route, verified in raw HTML), which is what actually moves rankings.
Technique gets you indexed; content gets you ranked. After the foundations, the question becomes which searches you target and whether your pages genuinely answer them — that’s exactly what OptiSearch analyses from your Search Console data.