Getting started
# Three steps. About five minutes.
AgentSite is the middleware that fixes Claude, ChatGPT, Gemini, and Perplexity reading your SPA as an empty shell. Getting started with AgentSite is three steps and about five minutes: sign up, paste one prompt to Claude, ship. The Install Prompt is the line Claude runs to wire your project — it picks the right pattern for your stack (nginx, Express, Express-sidecar, Edge, or streaming-SSR SDK), drops in the snippet, and verifies the rendered output. The Snippet is what renders your site on every agent fetch and serves the discovery files agents look for (`/llms.txt`, `/.well-known/*`, per-page markdown mirrors) — same response humans get.
1. 01
## Sign up. We mint your install token.
Create an account at [/auth/sign-up](/auth/sign-up). One account-level token (`asit_…`) gets generated automatically — Claude uses it to register your site for you in step 02. No "create a site" step before the install.
**No plan picker, no domain form.** Sign-up lands you straight here with the token already in hand. Claude registers the site the first time it calls `POST /site` with your URL.
2. 02
## Paste this prompt into Claude.
Site URL — optionalIntegration pattern — optionalAuto-detect from my repoNginxExpressExpress-SidecarEdgeSDK — Streaming SSR
Leave both blank for a one-line prompt — Claude reads `https://agentsite.app/install.md`, inspects your repo, and confirms the URL and pattern with you before writing any code.
prompt for Claude (or any coding agent)Copy prompt
```
Hey! Install agentsite.app. My token: asit_….
Read https://api.agentsite.app/agent.md end to end, then follow it: register the site via POST /site, install the snippet per https://api.agentsite.app/install.md, and verify with POST /site/:id/snippet-probe.
```
Pasted it and Claude finished? Open [/dashboard](/dashboard) — your site should appear as soon as Claude calls `POST /site`. If `snippet-probe` came back green, the install is live; if it didn't, paste Claude's report back into the conversation and we'll keep going.
No coding agent on hand? Scroll to [Doing it by hand](#by-hand) below — every recipe Claude can pick from is documented there too.
3. 03
## Deploy and enjoy.™
Push your branch. Once an AI bot fetches a page, the site flips from _report mode_ (the public-side AEO scan from §01) to _live_, and the dashboard starts counting real agent traffic with the before/after baseline preserved.

[/dashboard](/dashboard)
**Dashboard shows no live agent traffic after a few minutes? Run this curl.**
Most common cause: the token landed on the wrong container (API instead of frontend). This one-liner distinguishes a missing token from a render still warming up — hit your site with the AgentSiteBot user-agent and look for the enriched `<head>`:
terminalcopy
```
curl -sA 'AgentSiteBot/1.0' https://yoursite.com/ | grep -E '<title>|og:description|application/ld\+json'
```
If you see an updated `<title>`, an `og:description`, and at least one `application/ld+json` block, the token landed in the right pod and the render is in flight. If the output matches a plain `curl https://yoursite.com/` (your unmodified shell), re-check which container's env you set `AGENTSITE_TOKEN` in.
**Doing it by hand?Same recipes, line by line — Express + Docker is canonical; everything else is a platform delta on top.**
## What does agentsite add given what your site already does?
Honest answer: how much agentsite is worth depends on how much HTML your site already serves before JavaScript runs.
| If your site is… | You get from agentsite |
| --- | --- |
| **A client-rendered SPA**
React / Vue / Svelte / Solid / vanilla — `curl /` returns an empty shell | Everything. Per-route `<head>`, auto JSON-LD, markdown body spliced into a preboot `<div>` (hidden via inline CSS once your JS boots; `<noscript>` available as a per-site override), `/llms.txt`, `/sitemap.xml`, `/.well-known/*`, `.md` content negotiation. |
| **Already SSR'd**
Next.js SSR, Nuxt SSR, Astro hybrid, SvelteKit SSR, Rails, Django, WordPress… | Limited but real value: `/llms.txt` + `/llms-full.txt` mirrors, `.md` content negotiation (some agents prefer markdown over HTML), `/.well-known/*` agent discovery, JSON-LD only where you didn't ship it. Skip head enrichment — your SSR handles it. |
| **Statically rendered**
Astro static, Next static export, Hugo, Jekyll, Eleventy | Same as SSR — the `<head>` is already on disk. Worth installing for `/llms.txt`, markdown mirrors, and discovery endpoints. |
Pick your integration. Express + Docker is canonical; every other recipe is a platform-specific delta on top of it. Each integration has its own page — bookmarkable, shareable.
Production-readyVerified in production today.
[
Express + Docker
static SPA · canonical
The baseline every other recipe derives from. Static SPA in a Node container; snippet runs in Express middleware and splices the render bundle into your index.html.
View recipe →
](/install/express-docker)[
Nginx (VPS) — replace Nginx
simplest · static shell
Already running a static site behind Nginx on a VPS? Retire Nginx and let the Node snippet bind :80 directly. systemd unit + install commands ship as deltas.
View recipe →
](/install/nginx-replace)[
Nginx (VPS) — keep Nginx (sidecar)
static shell · sidecar
Have an established Nginx config (TLS, rate limits, multi-vhost) you don't want to redo? Run Node on :3000 and proxy from Nginx — let the snippet handle static-vs-HTML routing.
View recipe →
](/install/nginx-sidecar)[
Docker Compose
static shell
Add the snippet service to your compose file. The token goes on the frontend service, never on api/db/cache — most common split-stack install miss.
View recipe →
](/install/docker-compose)[
Kubernetes
static shell
Use the canonical Dockerfile as your image. AGENTSITE\_TOKEN goes in a Secret (not a ConfigMap), bound to the frontend Deployment via envFrom.
View recipe →
](/install/kubernetes)[
fly.io
static shell
flyctl picks up the canonical Dockerfile automatically. Just a small fly.toml and \`fly secrets set AGENTSITE\_TOKEN=...\` to deploy.
View recipe →
](/install/fly)[
render.com (Web Service)
static shell
Connect the repo as a Web Service with Docker runtime. The Static Site plan won't work — agentsite needs a long-lived process.
View recipe →
](/install/render)[
Railway
static shell
Railway's Nixpacks builder auto-detects the canonical Dockerfile. CLI or dashboard env vars; Railway encrypts everything by default.
View recipe →
](/install/railway)[
Heroku
static shell
Standard heroku/nodejs buildpack (not heroku-buildpack-static). Procfile points at the snippet's server.mjs; Heroku binds $PORT dynamically.
View recipe →
](/install/heroku)[
Google Cloud Run / AWS ECS
serverless container
Push the canonical Docker image, bind the token from the platform's secret manager. Cloud Run example below maps cleanly to ECS / Azure Container Apps.
View recipe →
](/install/cloud-run)[
Replit (Reserved VM / Autoscale)
static shell
Use the canonical server/ + dist/ layout. Free tier sleeps the runtime — use Reserved VM or Autoscale for an always-on listener.
View recipe →
](/install/replit)
Experimental / betaRecipes ship today; less battle-tested. Real installs welcome.
[
Reverse-proxy — any HTTP origin
experimental · Next.js, Astro, Nuxt, SvelteKit, Rails, Django, WordPress…
Sit in front of your existing app as a Node reverse-proxy. Your framework runs unchanged on a localhost port; agentsite intercepts HTML responses and injects the bundle.
View recipe →
](/install/reverse-proxy)[
Cloudflare Pages / Workers
experimental · edge
agentsite-edge.mjs is a pure Fetch-API port of the snippet. Drop two files into functions/ and your Pages site picks up enrichment on every HTML request.
View recipe →
](/install/cloudflare)[
Vercel (non-Next Vite SPA)
experimental · edge
Vite + React, Vite + Vue, anything non-Next. Drop in Vercel Edge Middleware. If you're on Next.js, use the reverse-proxy recipe instead.
View recipe →
](/install/vercel)[
Netlify Edge Functions
experimental · edge
Same edge core, different shell (Deno). Customers migrating off Netlify's deprecated prerender service install this way.
View recipe →
](/install/netlify)[
Static-only hosts
experimental · needs custom domain
GitHub Pages, S3, Lovable, Bolt.new, v0, Webflow, Framer, Squarespace — hosts that don't expose an edge runtime. Two paths: Cloudflare in front, or redeploy to a Node-capable host.
View recipe →
](/install/static-host)
**Don't see your stack?**[Tell us what you're trying to install](/contact) — we'll walk through what an integration would look like for you (and most of the time turn it into a documented recipe).
## Where do I go from here?
- [Feature reference →](/features)
- [Why we built this →](/about)
- [About AgentSiteBot (Cloudflare allowlist) →](/bot)
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