01What's actually happening
A React or Vite app built on Replit ships one small HTML file — around 1.6 KB — with an empty root element, and draws everything else with JavaScript after the page loads. People see the site; crawlers that read the HTML see nothing: no text, no links, no pages. The same app usually answers every address, including /sitemap.xml, with that same empty page, so there's no sitemap either. And www is often never provisioned at the host, so half the links fail certificate checks. Decent title and description tags make it look fine at a glance — the body is what's missing.
02What I found on four client sites
Montgomery Landscape: one crawlable page and ten findings. Beekon Light: five pages, twenty-three findings, five critical. Blended Barbers VA: one page, eight findings, a 41/100 health score. Buckets: three routes, sixteen findings. Every one a Replit-hosted single-page app.
03The fix
Prerender or statically export the public pages so the HTML carries the real text, keeping every URL. Publish a real sitemap and robots file. Add structured data and a canonical tag per route. Link www and apex properly. The app keeps working; the public pages simply become readable. Nobody has to leave Replit — all three live fixes still deploy there.
04What happened next
Montgomery: 38 crawlable pages, one finding, 96/100 health in back-to-back monthly snapshots. Beekon: twenty-three findings down to one. Blended: ten pages, two findings. Each has a case study on this site with the numbers and the live link.