It built exactly what you asked for

There is no platform default to blame here and no hosting behaviour to work around. Claude Code wrote what you described, and in several months of prompts you almost certainly never described being found.

Run the free check

Claude Code does not host your app, so its rendering behaviour comes entirely from the stack it wrote, which most often means Vite with React and client-side routing. Nothing in the tool will volunteer a sitemap, robots.txt, per-route metadata or structured data unless asked, because none of that is implied by a request to build a feature.

Why nothing was handled for you

Hosted builders have opinions. They decide how your app is served, and those decisions produce consistent behaviour you can look up and work around.

Claude Code writes code into your repository. The hosting is yours, the stack is whatever was chosen, and there is no platform layer making decisions on your behalf. That is the appeal of it and it is also why nothing on the technical list arrived by default.

So the question is not what does Claude Code do about SEO. It is what did you end up with, and that was determined by the stack, which was usually settled in the first prompt without anybody weighing it.

In practice this most often means Vite with React and client-side routing, which is the most common outcome in this whole field and has its own page in this section.

The prompt problem

This is the part worth understanding, because it explains why the gap persists over months of active development.

You ask for a feature and you get the feature. You ask for a page and you get the page. Every request is fulfilled well, and none of them imply the surrounding infrastructure that makes the result findable, because that is not what was asked.

A request to add a pricing page produces a pricing page. It does not produce a unique title for that page, an entry in a sitemap that may not exist, or a link from anywhere a crawler will find it, because none of those were mentioned.

The result is an app that grows steadily more capable and no more findable, and there is no moment where anything flags it.

What to ask for instead

The fix is to ask, once, for the whole set rather than discovering the gaps one at a time over months.

  • Ask for build-time pre-rendering of every route, with the route list derived from the router configuration rather than maintained separately.
  • Ask for a per-route metadata mechanism, then use it, with a different title and description for every page.
  • Ask for the sitemap to be generated during the build from the same route source as the pre-rendering, so the two cannot drift apart.
  • Ask for a robots.txt, and then read the result yourself rather than assuming it is sensible.
  • Ask for structured data appropriate to what the page is, and check the required properties are present rather than trusting that valid means effective.

Put it in the instructions file

The more durable fix is to stop relying on remembering, and this is specific to how these tools work.

Claude Code reads a project instructions file, and anything written there applies to every future session without being restated. This is where a standing rule belongs.

Write down that every new page must have a unique title and description, must be added to the route source that feeds the sitemap and the pre-render, and must be linked from somewhere a crawler will reach. Then it happens by default on work you have not thought of yet.

This is the difference between fixing the problem once and fixing it repeatedly. Without it, the next page you add in three months reintroduces the gap, because the session that adds it has no memory of the session that fixed it.

The advantage of having no platform

Having spent this page on the drawback, the other side is real and worth stating.

Nothing here is hidden from you. There is no verified crawler list producing different HTML for different visitors, no platform-generated file you cannot edit, no behaviour that changes when the vendor ships an update. What is in your repository is what is served.

That makes diagnosis unusually straightforward. Fetch a route without a browser and read what comes back. There is no ambiguity about whether a scanner is seeing a different version than Google is, because there is only one version.

It also means every fix in this section is available to you, immediately, without waiting for a platform to support it.

Where it still leaves you

Do the technical list and you have removed the obstacles. You have not yet solved the problem, and it is worth being clear about that.

An app with perfect rendering, a valid sitemap, unique titles and correct structured data, which consists of one page describing the product, can be found for one thing. That ceiling is set by what the pages are about rather than by how well they are built.

The tool that wrote your app can also write pages, and it is genuinely useful for that, on one condition: you supply the substance. A page generated from a general prompt about your category reads like every other page about that category and gets found by nobody.

The pages that work contain what only you know, which is what your users said, what surprised you, and where the product is the wrong choice.

Part of a larger guide

This page is one part of Vibe coding SEO. The other parts:

Questions people ask

Does Claude Code handle SEO?
Only what you ask for. It does not host your app, so there is no platform layer making decisions, and the rendering behaviour comes entirely from the stack it wrote, most often Vite with React and client-side routing. Nothing volunteers a sitemap or metadata because a request to build a feature does not imply them.
Why did months of development leave my app unfindable?
Because every request was fulfilled well and none of them implied the surrounding infrastructure. Asking for a pricing page produces a pricing page, not a unique title for it, an entry in a sitemap that may not exist, or a link from somewhere a crawler will find. Nothing flags the gap.
What should I ask Claude Code to build?
Ask once for the whole set: build-time pre-rendering with the route list derived from the router config, a per-route metadata mechanism, a sitemap generated from that same route source, a robots.txt, and appropriate structured data. Then read each result rather than assuming it is correct.
How do I stop the problem coming back?
Put a standing rule in the project instructions file, which is read in every future session. State that every new page needs a unique title and description, must be added to the route source feeding the sitemap and pre-render, and must be linked from somewhere a crawler reaches.
Is it easier or harder to fix than a hosted platform?
Easier to diagnose. Nothing is hidden, there is no verified crawler list serving different HTML to different visitors, and what is in your repository is what is served. Fetching a route without a browser tells you the truth with no ambiguity.
Can Claude Code write my content pages too?
Usefully, on one condition: you supply the substance. A page generated from a general prompt about your category reads like every other page about that category and gets found by nobody. The pages that work contain what only you know, from talking to users and building the thing.

Find out what your build is actually serving

The free Get Found Check fetches your routes the way a crawler does, which on a self-hosted app is the whole truth with no platform behaviour in the way.

Run the free check Have Licheo do it for you