Put key content in static HTML — Windsurf
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.
Fixing this in Windsurf
Codeium agentic AI IDE with Cascade
Windsurf Cascade can walk the entire project and apply multi-file edits in one pass. Paste the prompt below into your Windsurf chat and the fix rolls out across the project in one pass.
Using a different tool? Pick your stack:
The prompt for Windsurf
Copy and paste this into your Windsurf chat exactly as-is.
Using Windsurf Cascade, apply these edits across the project in one pass: 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 Windsurf
- 1. Open your Windsurf project.
- 2. Copy the prompt above with the copy button.
- 3. Paste into the Windsurf chat and send.
- 4. Review the diff, accept the changes, redeploy.
- 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
What about authenticated app pages?expand_more
Does a loading spinner help?expand_more
Want all 34 prompts tailored to your Windsurf 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 siteRelated Windsurf prompts
Add server-side rendering — Windsurf
Stack-specific prompt to ensure key content is in the HTML response, not rendered only via JS.
AI Search / GEOAdd an llms.txt file — Windsurf
Stack-specific prompt to publish llms.txt — a curated guide telling LLMs what your site is about.
AI Search / GEOAllow GPTBot, ClaudeBot, and PerplexityBot — Windsurf
Prompt to whitelist AI crawlers so ChatGPT, Claude, and Perplexity can cite your pages. Works in any AI-coded stack.
AI Search / GEOAdd JSON-LD structured data — Windsurf
Prompt to add Organization, Article, and FAQ JSON-LD to <head> — tells Google and AI crawlers exactly what your page represents.