AEO is the new SEO
# Claude can't read your SPA. AgentSite is middleware that fixes that — get your score, free.
AgentSite is middleware for the agent era — drop-in server-side rendering that gives Claude, ChatGPT, Gemini, and Perplexity an HTML version of your SPA to read. **AEO is the new SEO.** Run the free check and we tell you exactly what to fix — and what installing AgentSite will fix for you automatically.
agentsiteagentsite
Get your score — free
Free · no signup · live on screen in under 3 minutes · snippet stays in your codebase
Asked the best reasoning model in the world
## Even Claude Opus 4.7 can’t read your SPA.
Your SPA ships an empty `<div id="app">` to anything that can’t run JavaScript — and that’s every LLM your customers ask about you. When they ask _what is_ \[your-product\], the model fetches your homepage, gets nothing, and improvises.
Sometimes it punts with a technical explanation. Sometimes it hallucinates from your URL. Either way, **that’s the answer your next customer reads.**
[Get your score — free](/score)

Appears to be a marine biology research portal focused on lobster habitats in the North Atlantic.
— Claude Opus 4.7, asked about lobster.app
Claude Opus 4.7 — what can you tell me about lobster.appClaude Opus 4.7 — what can you tell me about workspot.ioClaude Opus 4.7 — what can you tell me about ridesell.appClaude Opus 4.7 — what is paperflow.io
## AEO has many angles. Here's where AgentSite sits.
Everyone has a different view of AEO — many products call themselves AEO, and they mostly do different things. Three categories you've probably seen, and where AgentSite is positioned against each one.
AEO graders
HubSpot grader, isitagentready.com, "ask GPT what it sees"
**They ask ChatGPT things you could've asked yourself. We actually crawl your site too.**
Most graders just pass your URL to a chat model and surface its answer — a question you can ask yourself, packaged as a lead-magnet for their actual product.
We crawl the assets a chat model never touches — meta, JSON-LD, generated markdown, `/llms.txt`, sitemap, `/.well-known/*` — and run a multi-pass problem assessment across eight citability dimensions. _Then_ we ask the chat models too. Then we install the middleware that moves the score.
Mention monitoring
Profound, Scrunch, Otterly
**Tracks how you're viewed externally. Doesn't move the needle.**
Useful information — but knowing you're not mentioned doesn't make you mentioned. AgentSite makes sure the models have something worth quoting in the first place.
Framework migration / dev work
Next.js, Nuxt, SvelteKit SSR rewrites
**Real work, real complexity added to your stack.**
Manual SSR migrations take weeks and bring permanent build-time overhead. AgentSite gives you robust, continuously improving AEO without complicating your build — install once, snippet handles drift.
### AgentSite works alongside:
Content improvement
Humans still write better than us. We ship automated basics and guidance; great pages still win.
External signals
Backlinks, getting featured, brand authority — still matters, still needed. AgentSite doesn't replace it.
What your report opens with
## See what they see.
With most Vue and React applications, an agent fetch **will not show the page content** — just the empty `<div id="app"></div>` SPA shell.
**AgentSite injects content and real meta tags** into that response — title, description, OpenGraph, JSON-LD, and a rendered markdown body — so the same URL is readable for agents and humans alike. Best-practice SEO and AEO.
**AgentSite also adds `.md` handling** — the same content served as a clean markdown twin at `<path>.md`, the format answer engines quote.
What agents see/features (no inject)With AgentSite/featuresMarkdown only/features.md
terminalcopy
```
curl 'https://agentsite.app/features'
```
response no headerrerun
<title>
agentsite — ready for the agent era.
meta description
Make your site agent-readable. Yours by default — we watch the agents, ship the best practices, and level your site up. ChatGPT, Claude, Gemini, and Perplexity see your SPA as an empty <div id="app">. We fix that with a snippet that stays in your codebase.
og:title
agentsite — ready for the agent era.
og:description
Make your site agent-readable. Yours by default — we watch the agents, ship the best practices, level your site up. Snippet stays in your codebase.
og:image
https://agentsite.app/brand/og-card.png
<div><pre> markdown body
— warming up; rerun in a moment —
**Show raw HTML response**
```
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>agentsite — ready for the agent era.</title>
<meta name="description" content="Make your site agent-readable. Yours by default — we watch the agents, ship the best practices, and level your site up. ChatGPT, Claude, Gemini, and Perplexity see your SPA as an empty <div id="app">. We fix that with a snippet that stays in your codebase.">
<link rel="icon" type="image/x-icon" href="/favicon.ico"/>
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"/>
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png"/>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"/>
<meta property="og:type" content="website">
<meta property="og:site_name" content="AgentSite">
<meta property="og:url" content="https://agentsite.app/">
<meta property="og:title" content="agentsite — ready for the agent era.">
<meta property="og:description" content="Make your site agent-readable. Yours by default — we watch the agents, ship the best practices, level your site up. Snippet stays in your codebase.">
<meta property="og:image" content="https://agentsite.app/brand/og-card.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Claude can't read your SPA. AgentSite is middleware that fixes that — get your score, free.">
<!-- Square variant for clients that prefer 1:1 (WhatsApp, iMessage). -->
<meta property="og:image" content="https://agentsite.app/brand/og-square.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="1200">
<meta property="og:image:alt" content="Claude can't read your SPA. AgentSite is middleware that fixes that — get your score, free.">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="agentsite — ready for the agent era.">
<meta name="twitter:description" content="Make your site agent-readable. Yours by default — we watch the agents, ship the best practices, level your site up. Snippet stays in your codebase.">
<meta name="twitter:image" content="https://agentsite.app/brand/og-card.png">
<!-- env dynamically generated by container -->
<script src="/env.js"></script>
<!-- Google tag (gtag.js) -->
<script>
function loadScript(src, async) {var script = document.createElement("script");script.setAttribute('src', src);if (async) script.setAttribute('async', "");document.head.appendChild(script);}
if (window.env.GOOGLE_ID) {
loadScript("https://www.googletagmanager.com/gtag/js?id=" + window.env.GOOGLE_ID, true);
}
</script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
if (window.env.GOOGLE_ID) {
gtag('js', new Date());
gtag('config', window.env.GOOGLE_ID);
}
// todo: uncomment consent when analytics tests complete
// const consent = localStorage.getItem('consentParams');
// gtag('consent', 'default', consent ? JSON.parse(consent) : {ad_storage: 'denied', analytics_storage: 'denied'});
</script>
<script type="module" crossorigin src="/assets/index-BRLq4YEG.js"></script>
<link rel="modulepreload" crossorigin href="/assets/naive-ui-BBRxOeyY.js">
<link rel="modulepreload" crossorigin href="/assets/markdown-CBjZTZqh.js">
<link rel="stylesheet" crossorigin href="/assets/index-Bky-ycNh.css">
</head>
<body>
<div id="app"></div>
</body>
</html>
```
You're spending hundreds to thousands a month on Claude and OpenAI tokens to make your product smart. Your landing page is invisible to the agents recommending tools.
569M
GPTBot fetches measured by Vercel. **Zero ran JavaScript.**
100/100
agentsite.app on Cloudflare's [isitagentready.com](https://isitagentready.com/agentsite.app). **Run the same check on yours.**
## Easy install. Optimized to not impact your performance.
Five minutes start to finish. Cold misses respond with your unmodified shell in milliseconds while we render in the background — humans never pay scan-and-generate latency, bots get the enriched response on the next fetch. Warm hits read the cached bundle.
### Sign up and get a token.
[Sign up](/auth/sign-up), pick a plan, register your domain. The kickoff allowance lets you try without a card.
### Tell Claude to set it up.
Paste this into Claude Code (or Cursor, Copilot, any coding agent). One prompt informs, instructs, and configures:
promptcopy
```
Set up agentsite on my server. My token is asit_xxxxxxxx. Read https://api.agentsite.app/llms.txt and follow the install instructions for an Express app serving a static SPA from `./dist`.
```
### Deploy and enjoy.™
Push your branch. The token usually needs to land in your CI/CD secrets or deploy environment (Claude will do this when it sets you up). The dashboard flips to live on the first agent fetch.
**Done.** Your SPA now serves real content to agents and share-card scrapers — in the same response real users get.
**No UA tricks. No bot routing.** Every visitor — human, GPTBot, ClaudeBot, Perplexity, share-card scraper — gets the same bytes.
Need more information? [Ask your agent if agentsite.app is cool.](https://claude.ai/new?q=Is%20agentsite.app%20cool%3F)
## Ways to get started, depending on your role.
Three doors into the same product — pick the one that matches who you are today.
[
Building it yourself?
Sign up and let an agent install it.
Get a token. Paste one line into Claude Code, Cursor, or Copilot. Pick the install pattern that matches your stack — Nginx, Express, Sidecar, Edge, or a streaming-SSR SDK — about five minutes start to finish.
Sign up →
](/auth/sign-up)[
Built it with Lovable, v0, or Bolt?
Your shipped SPA can still be agent-readable.
The AI tool generated a single-page app and called it done. We add the layer that makes ChatGPT, Claude, and Gemini able to read it — no rebuild, no second tool. Lovable's default Cloudflare deploy works out of the box via our Edge install.
Sign up →
](/auth/sign-up)
Running marketing or growth?
Run the report, bring it to your dev team.
Same scan, framed for hand-off. We'll show you exactly where to point them — or talk it through with the founder before you do.
[Run the report →](/score?audience=marketer)[Talk to the founder →](mailto:[email protected]?subject=agentsite%20chat)
## Common questions
**Do AI engines actually run JavaScript when they crawl?**
Overwhelmingly no. Vercel's analysis of half a billion GPTBot fetches found zero JavaScript execution. ChatGPT, Claude, Perplexity, Bing Chat, AI Overviews — they all read the raw HTML response. If your site is a SPA, all of them see `<div id="app"></div>` where your content was supposed to be.
**How is AgentSite different from AEO graders and mention-monitoring tools?**
Those tools diagnose. AgentSite diagnoses AND fixes — measures the same way they do, then installs the actual middleware that makes your content citable. The whole loop in one product.
**Why can't I just do this myself?**
You can. v1 is a weekend. What burns is the ongoing tail — bot UAs shift quarterly, `llms.txt` schema is still moving, attack-probes mutate, freshness scans need cluster-scheduling. Citation rates regress invisibly when any of it drifts, and you can't tell without scanning from outside. We treat that tail as the product — server-injected agent-readable markdown that LLMs read directly.
**Will this break my site?**
No. The snippet is fail-open — if our cloud is unreachable, it falls back to your unmodified `index.html`. No exception bubbles up to visitors. Removing the snippet is one line of code; everything goes back to before.
[Read the full FAQ →](/faq)
## Make your SPA legible to the agents that matter.
Free to try. Per-site tokens, usage in the dashboard, no UA tricks, no second deploy.
[Get your score — free](/score) [Sign up — free to start →](/auth/sign-up)
Free to start — kickoff allowance lets you try without a card. [See pricing →](/pricing)
Snippet stays in your deploy. Fail-open: if our cloud hiccups, you serve your unmodified `index.html`. Removing the snippet is one line.
Cookies
We use cookies to make this site work and to understand how it's used. [Learn more](https://www.cookiesandyou.com/)
Decline Got it