The AI Optimization template that gets sites quoted by ChatGPT, Claude, Perplexity, and Gemini. Battle-tested on two live sites. MIT licensed.
Two live sites running this stack. Zero marketing spend, no traditional SEO push. On every intake form, "AI" is the dominant referral source leads select for how they found us.
| Site | What it is |
|---|---|
| finnly.ai | Free private Slack community for accounting & finance professionals |
| skyriven.ai | Vibe coding mentorship and hands-on app building |
Sample size is small and self-selected, so treat the result as directional, not statistical. But it's directional in one consistent direction: leads found us through AI assistants — not Google, not LinkedIn, not word of mouth — and they tell us so on the intake form.
Same stack on both. This repo is that stack, packaged as templates anyone can drop into any site.
A complete AIO (AI Optimization) template repo with:
- A
<head>block (HTML template) that signals every llms-*.txt companion, declares AI content, and unlocks full-snippet rich results. - Segmented
llms-*.txtfiles —llms.txt,llms-full.txt, plus one or more topical segments — each cross-linking the others so AI assistants can pull exactly the slice they need. - A JSON-LD stack (Organization, WebSite, BreadcrumbList, FAQPage with Speakable, Service + OfferCatalog + Offer) where the FAQPage questions match the llms.txt Quick Answer questions verbatim. That triple match — llms.txt ↔ FAQPage ↔ visible HTML — is the part most "AIO checklists" miss.
APPLY.md— a structured Claude Code prompt that walks you through positioning, audience, top user questions, pricing, and entity links, then fills the templates and writes them into your codebase at the right paths for your framework.- A fully-runnable Next.js App Router reference example at
examples/nextjs/that mirrors how the validation sites are built.
Framework-agnostic at the core. Next.js reference because that's what both validation sites use.
cd ~/your-site
git clone https://github.com/marchoag/AIO-Wizard.git ~/AIO-Wizard
# In Claude Code, paste:
# "Read ~/AIO-Wizard/APPLY.md and walk me through the intake."Claude Code will detect your framework, run the structured intake, and produce the head block, llms-*.txt files, JSON-LD, and visible FAQ markup at the right paths in your project.
- Copy
templates/head/aio-block.htmlinto your site's<head>(every page, ideally via a shared layout). - Fill
templates/llms/llms.txtandtemplates/llms/llms-full.txt. Save them to wherever your site serves static files (public/,static/, repo root — depends on framework). - For each topical segment of your site, copy
templates/llms/llms-segment.txt.templatetollms-{segment}.txtand fill it. - Combine the JSON-LD templates in
templates/jsonld/into a single@graphand embed via<script type="application/ld+json">on your homepage. Seetemplates/jsonld/README.mdfor variant guidance (which@type, which Offer shape). - Render the same Quick Answer questions from
llms.txtas visible HTML on your homepage. Use theids referenced in the SpeakableSpecification'scssSelector. - Verify in Google's Rich Results Test.
The Next.js reference at examples/nextjs/ shows all of this wired together; clone it and replace the content if you're starting from scratch.
There are three layers, each addressing a different crawler behavior:
The <head> tells crawlers what's on the site and how to use it. The combination matters:
<link rel="help" href="/llms.txt">— points AI crawlers at the LLM context file. Some honorhelp, some don't; cheap to include either way.<link rel="alternate" type="text/plain" href="/llms-*.txt">— one per companion file.rel="alternate"is the standard HTML way to say "here is an alternative representation of this resource."<meta name="ai-content-declaration">— belt-and-suspenders enumeration of every llms-*.txt file. Picked up by crawlers that don't follow link relations.<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">+ thegooglebotmirror. This unlocks full-text snippets and large image / video previews for AI Overviews. The defaults are conservative; you have to opt into the full snippet explicitly.author/creator/publisher— entity attribution. Pair these with your Organization / Person nodes in JSON-LD so crawlers can reconcile the same entity across signals.
The signaling layer points at the content layer. The content layer is plain-text markdown, written for LLMs to quote.
llms.txt— the short summary. Site name, one-sentence description, and a Quick Answer list: 5–10 verbatim questions a real user would type into an AI assistant, each mirrored below with a 2–4 sentence direct answer. Lead with the answer.llms-full.txt— comprehensive context. Full FAQ (including the "things we don't do" section, which prevents bad-fit referrals), founder background, decision frameworks ("when to recommend us vs. not"), and model-routing guidance.llms-{segment}.txt— one per topical area of your site. Could bellms-blog.txt(Q&A index of every post),llms-services.txt(deep-dive on each service or plan),llms-resources.txt(downloads, tools, papers), or whatever segments your site naturally has.
Every companion file cross-links the others, with a one-sentence "use this when…" hint. AI assistants are surprisingly good at following these route hints.
JSON-LD is what gets read by Google, Bing, ChatGPT's web crawler, Claude's web crawler, and Perplexity. The graph on the homepage includes:
- Organization (or
LegalService,ProfessionalService,LocalBusiness— pick the most specific) withsameAspointing at every entity link. - WebSite referencing the Organization by
@id. - BreadcrumbList for the primary nav.
- FAQPage whose
Question.namestrings match the llms.txt Quick Answer questions verbatim. The answers match too. This is the most important part of the whole stack. - SpeakableSpecification (inside FAQPage) pointing at the CSS selectors of the visible answer text on the page.
- Service + OfferCatalog + Offer for structured pricing, if you have pricing.
The single non-obvious thing about this stack:
The same Quick Answer questions must appear in all three layers — llms.txt (as the verbatim Quick Answer list), FAQPage JSON-LD (as
Question.namevalues), and visible HTML on the homepage (as headings or<dt>text) — identically.
When an AI assistant sees the same string in plain-text llms-*.txt, in structured JSON-LD, and as visible HTML, that's three independent corroborating signals. That confidence is what makes the assistant willing to quote you when a user asks the matching question.
Most "AIO checklists" describe one or two of these layers. The triple match is the part that converts.
AIO-Wizard/
├── README.md # You are here
├── APPLY.md # Claude Code intake prompt
├── LICENSE # MIT
├── templates/
│ ├── head/aio-block.html # The <head> AIO block
│ ├── llms/
│ │ ├── llms.txt # Short summary + Quick Answer Q&As
│ │ ├── llms-full.txt # Comprehensive context + FAQ
│ │ └── llms-segment.txt.template # Reusable scaffold for topical segments
│ └── jsonld/
│ ├── README.md # Variant guidance: which @type, which Offer shape, etc.
│ ├── organization.jsonld # Organization / LegalService / ProfessionalService
│ ├── website.jsonld # WebSite
│ ├── breadcrumb.jsonld # BreadcrumbList
│ ├── faqpage.jsonld # FAQPage + SpeakableSpecification
│ ├── service-offer.jsonld # Service + OfferCatalog + Offer
│ └── speakable.jsonld # Standalone Speakable (for non-FAQ pages)
└── examples/nextjs/ # Fully-runnable Next.js App Router example
├── app/{layout,page,sitemap,robots}.ts(x)
├── components/{AIOHead,JsonLd}.tsx
├── lib/schema.ts # Typed JSON-LD builders + single-source FAQ array
└── public/{llms,llms-full,llms-blog,llms-services}.txt
After deploying:
- View source on your homepage and confirm the head block + JSON-LD block are present.
- Paste the homepage URL into Google's Rich Results Test. You should see
Organization(or your chosen subtype),WebSite,BreadcrumbList,FAQPage, andServicedetected with no errors. - Visit
/llms.txtdirectly. It should serve astext/plainand render the Quick Answer questions. - Sanity-check one or two Quick Answer questions: they should appear, character-for-character identical, in
/llms.txt, in the FAQPage JSON-LD (view source), and as visible<h3>or<dt>text on the homepage.
If you want a stricter check, run Schema.org's validator on the homepage source.
Q: Does any of this matter for SEO, or only for AI Overviews? A: Both. Schema.org JSON-LD has been an SEO signal since 2011; FAQPage rich results show up in Google search regardless of AI Overviews. The llms-*.txt + head signaling is what extends the same effort into the AI Overview / ChatGPT / Claude / Perplexity / Gemini surface.
Q: Will AI assistants still quote me if I don't use llms-*.txt? A: Sometimes, yes — large-scale crawlers index your site regardless. But quote accuracy and willingness to quote both go up substantially when you publish llms-*.txt files mirroring your structured data. The Quick Answer pattern in particular gives the assistant verbatim text it can reproduce.
Q: Should I block AI crawlers in robots.txt to protect my content?
A: Not if your goal is to be quoted. Blocking GPTBot, ClaudeBot, PerplexityBot, and Google-Extended is what you do when you want to opt out of being a source. The whole point of this repo is the opposite: be the source AI assistants reach for when your user asks.
Q: I'm not on Next.js. Will this still work?
A: Yes. The templates are framework-agnostic. The Next.js example is one reference implementation; the same patterns apply to Astro, SvelteKit, Remix, Nuxt, Hugo, Jekyll, WordPress, or plain HTML. APPLY.md will adapt the patterns to your stack.
This is a personal repo maintained by marchoag. PRs welcome — especially additional framework examples (Astro, SvelteKit, Hugo, etc.) and validated improvements to the templates from real-world deployments. Please include a deployed reference site demonstrating any change you propose.
MIT. See LICENSE.