Blog
The SEO checklist for websites built with AI coding tools
· 5 min read
You built a site in a weekend with Cursor, Claude Code, Lovable, Bolt or v0. It looks great. Then you share the link on X and the preview card is blank, or you search for your own product name on Google and nothing comes up.
That is normal. AI coding tools are very good at what you can see and much less careful about what you cannot: the metadata, the files crawlers read, and how the HTML is rendered. This checklist covers the parts they most often skip, in the order we would fix them.
1. Make sure the HTML actually contains your content
Open your site, press View Page Source (not Inspect), and search for your headline. If you see an almost empty <div id="root"></div> and a pile of script tags, your page is client-side rendered. The text only exists after JavaScript runs.
Google can render JavaScript, but it does so in a second pass that can be delayed, and many other crawlers, including a lot of AI crawlers, read only the raw HTML. The fix is to ship pre-rendered HTML:
- Static site generation (SSG): pages are built to HTML at deploy time. Best for marketing pages, docs and blogs. This site uses it.
- Server-side rendering (SSR): HTML is built per request. Use it when the content is personal or changes every minute.
- Client-side rendering (CSR): fine behind a login, poor for anything you want found.
In Next.js, a page with no request-time data is static by default, and output: "export" turns the whole site into plain files. In Vite or Create React App projects, consider a prerender step or moving the public pages to a framework that renders HTML.
2. Give every page a unique title and description
Each URL needs its own <title> and <meta name="description">. AI tools often set one title in the root layout and forget the rest, so every page shows up in search with the same name.
- Keep titles under about 60 characters and put the specific thing first: "Pricing | YourApp", not "YourApp | Pricing".
- Write descriptions of about 140 to 160 characters that say what the page does. Google may rewrite them, but a good one is used more often.
- Skip
<meta name="keywords">. Google has ignored it for many years.
3. Fix your link previews (Open Graph and X cards)
When you paste a link into X, LinkedIn, Slack or iMessage, the preview comes from Open Graph tags: og:title, og:description, og:image, og:url and og:type, plus twitter:card set to summary_large_image for the big card on X.
Here is a bug we shipped ourselves. Our root layout had a complete set of Open Graph tags. The homepage then set openGraph: { url } to add its own URL. In Next.js, nested metadata objects are replaced, not merged, so that one line silently removed og:image, og:type and og:site_name from the homepage only. Every other page was fine. If you use the Next.js Metadata API, build page metadata from one shared helper instead of patching single fields.
Check it: paste your URL into a card validator or view source and search for og:image. The image should be an absolute URL, 1200 by 630 pixels, and under about 5 MB.
4. Add a canonical URL
<link rel="canonical"> tells search engines which URL is the real one when the same page is reachable as /about, /about/, ?ref=x or www.. Without it, ranking signals can split across duplicates. Every indexable page should point to itself with an absolute URL.
5. Ship robots.txt and a sitemap
/robots.txttells crawlers what they may fetch. The most common AI-tool mistake is leaving a staging rule likeDisallow: /in production. Make sure that line is gone./sitemap.xmllists every page you want indexed, with a last-modified date. Reference it from robots.txt and submit it in Google Search Console.
Generate both from code if your framework allows it, so new pages are added automatically.
6. Check what your CDN does to bots
This one is easy to miss. Hosting and CDN providers increasingly offer one-click settings that block AI crawlers or challenge "bot-like" traffic. Some are on by default for new domains. Your robots.txt can say "welcome" while the CDN returns 403 to the same crawler.
Test it from a terminal by sending a request with a crawler's user agent, such as curl -A "GPTBot" -I https://yoursite.com. A 403 or a challenge page means the crawler cannot read you, whatever your robots.txt says. Decide on purpose which crawlers you want and set the CDN to match.
7. Add structured data
JSON-LD in a <script type="application/ld+json"> block describes the page to machines: an Organization with your logo and contact, a WebSite, SoftwareApplication for products, FAQPage for real FAQs, BlogPosting for articles and BreadcrumbList for navigation. It does not guarantee rich results, but it removes guesswork for search engines and for AI systems that summarize your page.
8. Get the basics of speed and accessibility right
- Serve images at the size they are shown, in WebP or AVIF, with
widthandheightset so the layout does not jump. - Lazy-load images below the fold. Do not lazy-load the hero.
- Use one
<h1>per page and headings in order. - Give every meaningful image real
alttext and give decorative imagesalt="". - Make the page readable at 320 pixels wide, with no sideways scrolling.
9. Verify, then tell Google
Add your domain to Google Search Console (a DNS TXT record is the cleanest way), submit the sitemap, and use URL Inspection on the homepage to request indexing. New sites can take days to weeks to appear. Search Console will show you what Google actually saw.
The short version
- Ship real HTML, not an empty div.
- Give each page a unique title, description and canonical URL.
- Set a complete Open Graph image and card.
- Add robots.txt and sitemap.xml, and remove any staging
Disallow. - Make sure your CDN is not blocking crawlers you want.
- Add JSON-LD.
- Verify in Search Console.
If you would rather not check all of this by hand, Web Scan runs 85+ checks across SEO, GEO, security and performance on any URL. Each failed check comes with a fix you can paste straight into Claude, Cursor or another coding agent. It is free, and you do not need an account.