Integrations/Lovable, Bolt, v0 & React SPAsApp builder
SEO for Lovable, Bolt, v0 & React SPA apps
Apps generated by Lovable, Bolt, Replit and Vite + React look finished in a browser, yet ship <div id="root"></div> with zero words in the raw HTML, identical <title> tags on every route, and 200 OK soft-404s. AI crawlers (GPTBot, ClaudeBot, PerplexityBot) do not execute JavaScript, so they see a blank page.
npx skills add subinternal/clickdRun clickd_check (kind: "agent") and clickd_brief on our deployed app, show why crawlers see an empty #root shell, add build-time prerendering and per-route metadata, and rescan.
What breaks most often on Lovable, Bolt & SPAs
What clickd catches when it fetches the live URL the way Googlebot and AI crawlers do.
- Empty <div id="root"></div> HTML shellClient-only Vite + React SPAs send zero words before JavaScript runs, making every route unreadable to non-JS AI crawlers.
content-in-html - One static index.html title for every URLUpdating
document.titleinside React only happens after client JS runs; link previews and non-JS bots see the defaultVite + Reactor home title everywhere.title - SPA catch-all soft 404s & missing sitemapRewriting
/* -> /index.htmlreturns HTTP200on nonexistent URLs and ships withoutrobots.txt,sitemap.xmlor/llms.txt.sitemap
The Lovable, Bolt & SPAs agentic SEO loop
Four steps your agent runs between your codebase and clickd’s live crawler.
- 01Prove the blank-HTML bug
Run clickd_check (kind: "agent") on your live URL so you and your agent see the exact empty HTML shell AI crawlers receive.
clickd_check - 02Prerender or SSR public routes
Add static route prerendering at build time (or migrate public marketing routes to Next.js / Astro / React Router SSR) so HTML contains every heading and paragraph.
technical-seo - 03Emit per-route <head> & JSON-LD
Render unique
<title>,<meta name="description">,<link rel="canonical">, Open Graph tags and JSON-LD into each prerendered route’s<head>.schema-markup - 04Add sitemap.xml, robots.txt & rescan
Generate
public/sitemap.xml,public/robots.txtandpublic/llms.txtat build time, deploy, and run clickd_rescan to confirm a passing score.clickd_rescan
Worked pattern
clickd_check (kind: "agent") compares raw HTTP HTML against your intended page copy.
What non-JS AI crawlers read before and after prerendering
Sample<!-- BEFORE: Default Vite / Lovable / Bolt SPA response -->
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
<!-- AFTER: Prerendered / SSR marketing route -->
<body>
<main>
<h1>Automated invoice reconciliation for construction</h1>
<p>Match supplier invoices against quoted unit prices in 30 seconds...</p>
</main>
</body>Prompts to run on Lovable, Bolt & SPAs
Copy any prompt into Claude Code, OpenAI Codex, Cursor or Windsurf.
- Diagnose invisible Lovable / Bolt site
Run clickd_check (kind: "agent") and clickd_brief on example.com, list every route returning an empty #root shell, and add build-time prerendering for our public pages.
- Fix link previews & per-page titles
Ensure every public route outputs its own static <title>, meta description, canonical and og:image in raw HTML before JavaScript runs, then test live with clickd.
- Add sitemap, robots.txt & AI visibility
Generate sitemap.xml, robots.txt (allowing OAI-SearchBot, ClaudeBot and PerplexityBot) and llms.txt from our router, deploy, and rescan with clickd.
Skills to pair with Lovable, Bolt & SPAs
Included when you run npx skills add subinternal/clickd.
- Technical SEOAudits and fixes crawlability, indexing, robots.txt, XML sitemaps, canonicals, redirect chains, server-rendered HTML and security headers in your site’s codebase, then checks every fix live with clickd.See skill
- AI visibilityAudits and fixes your site’s visibility in ChatGPT, Claude, Perplexity and Google AI Overviews: AI crawler access, non-JS HTML readability, answer-first passages, entity sameAs schema and live citation tracking.See skill
- On-page SEORewrites title tags, meta descriptions, single H1s, question headings, answer-first openings, image alt text and AI writing tells in your site’s templates and content files, checked live with clickd.See skill
- Schema markupGenerates, wires and validates JSON-LD structured data (Organization, LocalBusiness, Product, Service, Article, FAQPage and BreadcrumbList) from the visible facts on your pages, checked live with clickd.See skill
Questions about Lovable, Bolt, v0 & React SPAs & clickd
- Can Google index a client-rendered React SPA without prerendering?
- Googlebot eventually renders JavaScript in a second wave, though client-only SPAs suffer delayed indexing, missed meta tags on link previews, and soft-404 bugs. Worse, major AI assistants (
GPTBot,ClaudeBot,PerplexityBot) do not run client JavaScript at all, so an unprerendered SPA is invisible to AI search. - Do we need to rewrite our entire authenticated dashboard to fix SEO?
- No. Keep your signed-in app (
/app/*orapp.example.com) as a client SPA, and prerender or server-render only your public marketing, pricing, docs and guide routes (/,/pricing,/guides/*).
Other integrations & stacks
- Google Search ConsoleTeams who want their coding agent driven by real Search Console impressions instead of guessed keyword volume.Data source
- Next.jsTeams shipping on Next.js App Router or Pages Router with Claude Code, Codex or Cursor.Web framework
- AstroTeams running marketing sites, docs and content hubs on Astro.Web framework
- ShopifyShopify and Shopify Plus stores on Liquid themes or Hydrogen headless storefronts.Storefront & CMS
- WordPressTeams managing custom WordPress block/classic themes, WooCommerce stores or headless WordPress.Storefront & CMS
- WebflowMarketing and design teams running Webflow CMS sites alongside an AI assistant.Storefront & CMS
- SvelteKitEngineering teams building web apps and marketing sites on SvelteKit and Svelte 5.Web framework