---
url: "https://agentsite.app/features"
title: Features — install patterns — agentsite
description: AgentSite ships nginx, Express, Express-sidecar, Edge, and streaming-SSR SDK installs. Per-page markdown mirrors, /llms.txt, FAQPage schema, and request cache.
tldr: "AgentSite's features ship across install patterns: nginx, Express, Express-sidecar, Edge, and streaming-SSR SDK. Each install gets the same render bundle — markdown body, schema graph, OpenGraph meta — plus per-page .md mirrors, an authoritative /llms.txt index, FAQPage schema synthesis from question headings, and a request cache. Pick the install pattern that matches your stack."
og_image: "https://agentsite.app/brand/og-card.png"
screenshot_url: "https://agentsite-screenshots.nyc3.digitaloceanspaces.com/screenshots/2026/05/rbnd_1ksvnqjfn1m146m1pbr72t.jpg?v=1780118960972"
rendered_at: "2026-05-30T05:29:20.972Z"
expires_at: "2026-05-31T05:29:20.972Z"
engine: playwright
cache_status: hit
schema_jsonld: "[{\"@id\":\"https://agentsite.app/#organization\",\"url\":\"https://agentsite.app\",\"name\":\"agentsite\",\"@type\":\"Organization\",\"sameAs\":[\"https://www.linkedin.com/in/dathan-guiley/\"],\"@context\":\"https://schema.org\"},{\"@id\":\"https://agentsite.app/features#webpage\",\"url\":\"https://agentsite.app/features\",\"name\":\"Features — install patterns — agentsite\",\"@type\":\"WebPage\",\"@context\":\"https://schema.org\",\"isPartOf\":{\"@id\":\"https://agentsite.app/#website\"},\"description\":\"AgentSite's features ship across install patterns: nginx, Express, Express-sidecar, Edge, and streaming-SSR SDK. Each install gets the same render bundle — markdown body, schema graph, OpenGraph meta — plus per-page .md mirrors, an authoritative /llms.txt index, FAQPage schema synthesis from question headings, and a request cache. Pick the install pattern that matches your stack.\",\"primaryImageOfPage\":{\"url\":\"https://agentsite.app/brand/og-card.png\",\"@type\":\"ImageObject\"}},{\"@id\":\"https://agentsite.app/#website\",\"url\":\"https://agentsite.app/\",\"name\":\"agentsite\",\"@type\":\"WebSite\",\"@context\":\"https://schema.org\",\"publisher\":{\"@id\":\"https://agentsite.app/#organization\"}}]"
---
Features

# What you get when you install AgentSite.

AgentSite's features ship across install patterns: nginx, Express, Express-sidecar, Edge, and streaming-SSR SDK. Each install gets the same render bundle — markdown body, schema graph, OpenGraph meta — plus per-page `.md` mirrors, an authoritative `/llms.txt` index, FAQPage schema synthesis from question headings, and a request cache. Pick the install pattern that matches your stack.

More organic traffic from AI search

Agents that can read your site cite your site. Citations send users back. SPAs that ship an empty shell don't get cited — they get skipped.

Trust with agent-first users

People navigating with ChatGPT, Claude, Perplexity notice which sites their agents handle cleanly. Those are the sites they remember — and prefer.

Stop worrying about AEO.

We take what your site naturally produces and make every agent contact point better through our generated agent version — llms.txt, schema, markdown, the lot. You install once; we keep up with the drift.

Three things you get out of the box: agent-readable content generated on demand, standards-compliant docs that stay current as the standards drift, and intelligent merging with the meta and schema you already wrote. Pick the install pattern that matches your deploy — Nginx, Express, Express-Sidecar, Edge, or a streaming-SSR SDK — and the same render bundle lands in your response.

## 1 · Dynamic generation of content for agents

Every page on your SPA gets agent-readable content rendered when it's first asked for — not authored by you, not stale, not frozen at build time. Headless Chromium runs your shell, waits for content, and captures the title, description, og:image, JSON-LD graph, and markdown body that an actual user would see. On cold miss the snippet serves your unmodified shell immediately and renders in the background; first agent to hit a path warms the cache for everyone after.

![Clean markdown body served at agentsite.app/install.md — the exact bytes an agent extracts.](/brand/features/feature-1-markdown.png)

`agentsite.app/install.md` — the same markdown body an agent reads when it fetches your page. Add `.md` to any path; same content, no HTML chrome.

-   **Preboot hidden-div default.** The markdown body lands inside `<div id="agentsite-preboot" aria-hidden="true"><pre data-content-type="text/markdown">` just before `</body>`. A toggle script + style in `<head>` hides it the moment JS boots, so humans never see it; agents and extractors that strip `<noscript>` (Claude.ai's web tool, most readability libs) read it cleanly. Per-site override switches to legacy `<noscript>` mode for tools that honor that (Claude Code's WebFetch).
-   **Wait-for-generation: `robots-only` by default.** Bots are usually the first requester of a page; they don't retry. So bots block on the first render and get real content. Humans get the unmodified shell + an async render — they never pay the scan-and-generate latency. Switchable per-site to `always` or `never`.
-   **TL;DR extraction per page.** 40–60-word direct answer drives meta descriptions + article descriptions when your static defaults are too generic.
-   **Content-hash dedupe.** When nothing on the page changed, we extend the cache expiry without re-running the renderer — `dateModified` stays truthful instead of refreshing to "now" on every request.
-   **Per-page markdown.** Same content as the preboot body, in a denser format. Reachable via `Accept: text/markdown` or by adding `.md` to any path.

## 2 · Best-practice documents that stay current

Every standards-compliant doc an AI crawler expects on your domain — generated, served, kept current as the standards drift. You ship zero static files; the snippet serves them all dynamically from your live cached bundles.

![agentsite.app/llms.txt rendering — site overview with page list and TL;DRs.](/brand/features/feature-2-llms-txt.png)![agentsite.app/robots.txt rendering — granular AI-bot allow-list with comments.](/brand/features/feature-2-robots-txt.png)![agentsite.app/sitemap.xml rendering — walked from cached routes, standard urlset.](/brand/features/feature-2-sitemap-xml.png)

Live on `agentsite.app`: `/llms.txt` · `/robots.txt` · `/sitemap.xml`. Generated, not authored. Customer files in `dist/` win.

-   **`/llms.txt` + `/llms-full.txt`** per Jeremy Howard's spec — a pointer overview at `/llms.txt`, with detail in `/install.md` and `/docs.md` for agents arriving with no prior context.
-   **`/sitemap.xml`** walks your cached routes, drops auth/admin paths, emits standard sitemaps.org `<urlset>`.
-   **`/robots.txt`** with a granular AI-bot allow-list: citation bots allowed, training bots policy explicit, heavily commented so you can audit.
-   **Per-page `.md` mirrors.** Mintlify-style content negotiation: `Accept: text/markdown` or `.md` path suffix returns the markdown body without HTML chrome.
-   **Customer overrides win.** Ship `dist/llms.txt` and your file beats ours via static-route precedence. We're the default, not the ceiling.
-   **Schema.org drift handled.** Our generator updates as standards evolve; customer-shipped JSON-LD freezes on the day it's written. Install-stays-fresh is the live argument here.

## 3 · Intelligent merging with what you already have

Your existing meta, schema, and per-page overrides are preserved verbatim — we fill gaps, we don't overwrite. The page reads as "yours plus ours," not "ours instead of yours."

![JSON-LD blocks pulled from agentsite.app/pricing — Article, Organization, WebPage, FAQPage emitted via @id-linked nodes.](/brand/features/feature-3-jsonld.png)

Real JSON-LD blocks from `agentsite.app/pricing` — multiple `@type`s cross-linked via `@id`. Customer-shipped schema wins; ours fills the gaps.

-   **Meta refreshed in place.** Your indentation, comments, and per-page overrides survive. Hand-rolled `og:type=article`, custom canonicals, alternate languages — pass through untouched.
-   **JSON-LD only-if-absent.** Existing `<script type="application/ld+json">` blocks are parsed; we emit ONLY the `@type`s not already present. Per-page hand-rolled JSON-LD always wins; we cross-link new nodes to your existing ones via `@id` so the graph resolves into one coherent description.
-   **LLM-assisted FAQ extraction** refines `FAQPage` schema from prose that doesn't follow the `## Question?` heading convention. We won't name a specific model — we iterate on what scores best on our own renders.
-   **Customer files in `dist/` win** over our generated versions of the same path (llms.txt, robots.txt, sitemap.xml). Our default is the floor; you can always go higher.

## 4 · Drops into your stack

Same render bundle, different injection point — pick the shape your deploy already supports.

![Terminal showing the Express install pattern — curl the snippet, three lines of glue code, set the token, ship.](/brand/features/feature-4-install.png)

Express install pattern end-to-end: curl the snippet, three lines of glue, set `AGENTSITE_TOKEN`, ship. About five minutes start to finish.

Nginx

Our favorite

Thin nginx in front of a static SPA. Add a handful of `location` + `proxy_pass` directives; agentsite owns the HTML byte stream. No Node sidecar, no edge function, no code in your deploy.

Express

Static SPA in a Node container. The snippet runs in your Express middleware, splices the render bundle into your `index.html` before responding. One CJS file, audit-able line by line.

Express-Sidecar

Non-streaming SSR framework (Next.js pages router, Nuxt 2, Rails, Django, PHP-FPM, etc.). Snippet runs as a reverse-proxy sidecar in front of your framework's existing server.

Edge

Cloudflare Pages, Vercel edge, Netlify, or any platform that runs Fetch-API edge functions instead of arbitrary Node. Drop in `agentsite-edge.mjs` + the platform's edge-middleware shell.

SDK — streaming SSR

Framework SDK for streaming SSR — Next.js App Router (RSC), Nuxt 3 streaming, SvelteKit streaming, Suspense streaming. In-process render hooks instead of a proxy in front of your framework.

**Latency-sensitive.** Cold miss responds with your unmodified shell in milliseconds and renders in the background. Warm hits read the cached bundle from Postgres + edge cache. Sites that need first-render freshness on bot traffic flip wait-for-generation to `always`; sites that prioritize human TTFB above all keep the default. `Cache-Control: no-cache` forces a fresh render on any request.

**Further out.** Native nginx-njs port, CloudFront Lambda@Edge, Python (Django/Flask/FastAPI), PHP (PHP-FPM / WordPress). No build-time pre-render CLI — SPAs are runtime-rendered by design.

## 5 · Tunable from the dashboard

Per-site controls for the behaviors that matter, plus the AEO Report — the same scan we use to grade our own renders, run against any URL.

Dashboard — Settings tab

Screenshot pending. Surfaces wait-for-generation policy, skip-patterns textarea, render-mode override, and usage counters in one view.

Per-site config + usage at [/dashboard](/dashboard).

-   **Wait-for-generation policy.**`robots-only` (default) · `always` · `never`. Decides who blocks for the first render on a cold path.
-   **Render-mode override.** Preboot hidden-div (default) or legacy `<noscript>`. Switch per-site for tools that honor one but not the other.
-   **Skip patterns.** Glob-match paths you don't want rendered (admin, search, attack probes). Copy-paste textarea; common probes auto-add as they're detected.
-   **AEO Report.** Run an 8-dimension citability scan on any URL at [/score](/score). Free, no signup. The same yardstick we grade our own output on.
-   **Per-site API tokens.** `asit_…` opaque strings, hashed with SHA-256. Pinned to one registered domain — leaked tokens are useless off-domain. Rotate any time.
-   **Usage tracking.** One row per `(site, day_utc)` with cache-hit / cache-miss / forced-sync / auth-failure counters. 30 days of history per site in the dashboard.

## 6 · What you didn't have to build yourself

Each row below is something AgentSite replaces. The alternative imposes the cost in the left column; the feature is that you don't pay it.

Second parallel deployment (Chromium fleet on your infra)

Render fleet runs on ours. Your container is just Node + your SPA + a small snippet.

Build-time pre-rendering of every route

We render on demand and cache. First agent to hit a path warms the cache for everyone after.

Periodic snapshot drift between rebuilds

Content-hash dedupe + 24h TTL with `Cache-Control: no-cache` bypass. Snapshots stay current without nightly rebuilds.

UA-switching / cloaking-adjacent config

Same bytes to humans and bots. The agent-readable layer lives in a preboot div + JSON-LD blocks — a real user never sees a different DOM than a crawler does.

Framework migration to SSR

Snippet drops into your existing nginx, Express server, or sidecar. Streaming-SSR shops drop in the framework SDK without rewriting. Your component tree, routing, and build pipeline are untouched.

Maintaining your own LLM pipeline for content gen

TL;DR extraction, FAQ refinement, schema detection — we run the LLM hops; you pay per render at our rate, not per token at theirs.

Tracking schema.org standard drift

Our generator updates; customer-shipped frozen JSON-LD decays silently. Install-stays-fresh is the live argument.

An npm SDK / opaque library

Snippet is plain CJS or Fetch-API, audit-able, lives in your codebase. Curl + drop.

## What we deliberately don't do

-   **No User-Agent switching.** If two visitors get different bytes for the same URL, that's cloaking. We don't. The snippet is UA-blind; bot identification is telemetry only.
-   **No mailbox / mirror site.** AgentSite never becomes the public destination — your domain stays canonical.
-   **No retry storms.** If our API errors, the middleware serves your unchanged HTML and moves on. Fail-open is non-negotiable.
-   **No tracking pixels in the bundle.** The injected payload is meta tags, markdown, and standards-compliant schema.org JSON-LD. Nothing else.
-   **No build-time pre-render CLI.** SPAs are runtime-rendered by design. A "build and walk every route" step is against the grain of why you shipped a SPA.
-   **No LLM-brand promise.** We iterate on which model scores best for FAQ extraction and TL;DR generation; we won't name one in marketing because we'll swap it the moment a better one ships.

[Pick your install pattern →](/getting-started)

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