AI Search / GEO·Cursor
AI Search / GEOCursor

Put key content in static HTMLCursor

If you view-source your page and cannot find your content in plain text, neither can AI crawlers. Google renders JS eventually; AI crawlers often do not render it at all.

rocket_launch

Fixing this in Cursor

Agentic AI code editor built on VSCode

In Cursor you edit real files, so this fix lands via direct diffs instead of a regenerated project. Paste the prompt below into your Cursor chat and the fix rolls out across the project in one pass.

Using a different tool? Pick your stack:

The prompt for Cursor

Copy and paste this into your Cursor chat exactly as-is.

Apply these changes to my codebase. Edit the files directly and keep existing formatting:

Increase static content density

1. Identify the page sections that currently render as empty divs filled by JavaScript.
2. Move the actual text content into the static HTML — headlines, body copy, lists.
3. Trim wrapper divs that exist only for layout — fewer divs, more semantic tags (article, section, p).

Why this matters

This is the corollary to the SSR prompt. Even with SSR set up correctly, you can still end up with client-rendered content if you mark the wrong components `"use client"` or fetch data in useEffect that is needed for the first paint.

View-source (not Inspect) is the ground truth. If your headlines are in view-source, good. If they are only visible in Inspect (which runs JS), AI crawlers will not see them. Google will, eventually, but the delay and reliability penalty are real.

Fixing this usually takes refactoring 5-10 components from client to server-rendered. The rule of thumb: main page content is server-rendered; interactive widgets (search boxes, chat, filters) are `"use client"`.

How to use this prompt in Cursor

  1. 1. Open your Cursor project.
  2. 2. Copy the prompt above with the copy button.
  3. 3. Paste into the Cursor chat and send.
  4. 4. Review the diff, accept the changes, redeploy.
  5. 5. Verify the fix using the checklist below.

Common mistakes to avoid

  • error_outlineFetching content in useEffect and rendering a loading skeleton on first paint — the skeleton is what ships in HTML, not the content.
  • error_outlineMarking a layout file `"use client"` in Next.js — cascades to every page.
  • error_outlineUsing `next/dynamic` with `ssr: false` for content that should be public.
  • error_outlineHiding content behind a state toggle (e.g., a tab that is JS-initialized) — hidden content in HTML is fine; unrendered content is not.

How to verify the fix worked

  • check_circleView-source (Ctrl+U) — your main headline, first paragraph, and CTAs must be in the HTML.
  • check_circleDisable JavaScript — reload — core content must still render and be readable.
  • check_circle`curl -s URL | grep "your keyword"` — returns matches for important content.
  • check_circleTest with https://www.browserless.io/ or a headless fetcher without JS — content appears.

Frequently asked questions

Should I render everything server-side?expand_more
No. Interactive parts belong client-side. Split: main content server-rendered, widgets client-hydrated.
What about authenticated app pages?expand_more
App pages behind login do not need SSR for SEO since they are not indexed. Keep them client-rendered if that is simpler.
Does a loading spinner help?expand_more
For users, yes. For SEO/GEO, no — the spinner in HTML is useless content. Ship the real content.

Want all 34 prompts tailored to your Cursor site?

Pantra scans your site in 10 seconds, detects the stack, and generates the exact prompts that apply — only the ones you actually need.

Scan my site

Related Cursor prompts