A/GEOResearch
← All insights

How We Built ageoresearch.com Without a CMS: The Tech Stack, the AI Visibility Score and A/GEO Answers

Our site is plain HTML on Cloudflare, with no CMS. This post explains why, what it solves, how the AI Visibility Score works and how the A/GEO Answers chat keeps to public facts.

The answer

We built ageoresearch.com as plain HTML on Cloudflare, with no CMS. One small build script makes each page, its schema and our llms.txt file from the same source. Free tools, such as the AI Visibility Score, turn visits into leads. The A/GEO Answers chat answers from our public pages only. Code stops off-topic questions, attempts to change its rules and any path to private documents.

This post explains our thought process, the problems the build solves and how each part works. It also shows how to apply the same ideas to a site that you already have, with or without a CMS (content management system).

Download the one-page tech stack (PDF)

What problem did our website have to solve?

A website for an agency has one job: turn a visit into a lead. The businesses that we talk to have the same three lead problems. They get too few leads. The leads they get go cold before the first call. They cannot tell which channel brought a lead in.

Buyers now start part of their search in AI tools. In the BrightLocal Local Consumer Review Survey 2026, 45% of 1,002 US adults used ChatGPT or other AI tools to find local businesses. In 2025, the figure was 6%. An AI answer names only a few businesses. If the AI tool cannot read your site, it names someone else.

So we set five requirements for our own site before we picked any tool:

  1. AI tools must read every word. Each page must send its full text, headings and schema in the first response.
  2. Pages must load fast on a phone. A buyer who finds us on a phone must not wait for the page.
  3. Each claim must have a source. AI tools and buyers trust facts that they can check.
  4. A visitor must get value before a sales call. Free tools give the visitor a reason to leave an email.
  5. Questions must get answers at the moment of interest. A visitor who waits a day for a reply can lose interest.

Why did we not use a CMS?

A CMS solves a problem that we do not have, and it adds problems that we do not want. A CMS lets many editors publish from a dashboard. Our site has one editor. Our edits go through code, with an AI coding assistant, and each edit is a commit with a full history.

The problems a CMS often adds work against the five requirements above:

Common CMS problemEffect on leadsWhat we did instead
Page builders that show text with JavaScriptAI crawlers that do not run JavaScript see an empty or partial page.Every page is complete HTML. No script is necessary to read it.
Many plugins, each with its own scriptsSlow pages on phones, and more updates to apply.One build script with no outside packages.
Schema from a plugin, separate from the page textThe schema and the page can say different things. AI tools trust neither.The build makes the schema, the FAQ and llms.txt from the same page data.
A database and an admin loginMore ways to attack the site, and more hosting cost.No database and no admin login. Static files on Cloudflare's network.

A CMS is still the right choice for some teams. Use one when many people who do not write code publish every day. The trade-off for us is real: a person cannot edit a page in a dashboard. We accept it, because AI coding tools make each edit fast, and each change gets a preview build before it goes live.

What is in the ageoresearch.com tech stack?

The stack has six layers, and each layer has one job. The one-page PDF shows the same six layers. Our colophon links to the documentation for each part.

LayerToolsJob
1. Domains and edgeCloudflare DNS, Cloudflare Pages, Pages Functions, edge cacheServe every page from one canonical address. Send other domains to it with a 301 redirect. Guard private proposal pages with a password.
2. The websiteStatic HTML from one Node script, schema.org JSON-LD, llms.txt, XML sitemap, self-hosted fontsGive people and AI crawlers the full page, with structured facts, in the first response.
3. Free toolsAI Visibility Score, AI Search Visibility Audit, Schema Generator, PDF to Flipbook Maker, LLM WatchGive visitors value first, and a reason to leave an email.
4. A/GEO Answers chatTurnstile, Jev by TypeSafe, Cloudflare AI Search and R2, AI Gateway, Claude Haiku 5.5, Llama 3.3 70B on Workers AIAnswer questions from our public pages, then offer one next step.
5. Leads, email and paymentA form function at /api/form, Resend, Stripe Payment Links, Cloudflare Web AnalyticsCapture each lead, email it to us, send the playbook emails from our own domain, take payment for the Starter Package and count visits without cookies.
6. Build and qualityGitHub, GitHub Actions, Wrangler, Playwright, axe-coreKeep a history of every change. Test each page for speed, layout and accessibility before it goes live.

Two parts are easy to miss. Cloudflare DNS holds the records for all three of our domains: ageoresearch.com, ageo.agency and localaipresence.com. Resend handles every form. Each form posts to our own function at /api/form. The function emails the lead to us with the visitor as the reply-to address, and saves the visitor as a Resend contact. People who do not ask for updates stay unsubscribed. So the lead alert, the lead record and the email list stay in one place, with no separate form service.

How does the build work?

Each page is one HTML file with a small block of facts at the top. The build script does the rest. The script has no outside packages, so nothing in it can break when a package changes.

  1. We write the page body and a short facts block: title, description, date, category and the FAQ questions.
  2. The script wraps the page in the shared header and footer. It adds the canonical link, the share tags and the JSON-LD schema: Organization, Service, Article, FAQPage and breadcrumbs.
  3. The script writes the sitemap, the insights list, the related articles and the Contents list for each post.
  4. The script stops the build when a page has no canonical link or has two elements with the same id.
  5. The script copies the main text of each public page into the chat's content file.
  6. A commit starts a new build on Cloudflare Pages. A GitHub Action sends the new page text to R2, the file storage that the chat search reads.

The result is one source of truth. When we change a price on a page, the schema, the FAQ and the chat all get the new price at the next publish.

How does the AI Visibility Score work?

The AI Visibility Score reads four public files from your site, runs 37 checks in 8 factors and gives a score out of 100. It takes about 20 seconds. It shows your top three fixes, ranked by the points that each fix adds.

The scan runs in a Cloudflare Pages Function at /api/scan. It fetches your home page, robots.txt, your XML sitemap and llms.txt. It reads the HTML as text and does not run JavaScript. Most AI crawlers read a page the same way, so the score shows what they can see.

FactorPointsWhat it checks
AI crawler access15The page loads, can be indexed and loads fast. robots.txt does not block GPTBot, ClaudeBot, PerplexityBot or other AI crawlers.
Structured data15JSON-LD is present and valid. It names the organization with the right type, properties and profile links.
Readable without JavaScript15Enough text, one H1, page landmarks and alt text in the raw HTML.
Page basics15Title, description, canonical link, language, viewport and H2 headings.
Answer-ready content10An FAQ on the page, FAQPage schema, and schema that matches the visible questions.
Business facts10Phone, address, contact page, about page and privacy policy.
Discovery files10An XML sitemap and an llms.txt file.
Authority and sharing10Share preview tags, links to official profiles and review signals.

The score uses the same grades as our 50-check audit: Invisible (0 to 15), Trace (16 to 35), Findable (36 to 55), Quotable (56 to 79) and Cited by default (80 to 100).

The scanner has its own safety rules. It scans only public web addresses. It refuses private networks and local addresses. It follows five redirects at most, stops after 8 seconds and reads 1.5 MB at most. It keeps each result for one hour, so a shared link does not scan your site again.

The score has a limit, and we say so on the page. It measures whether AI tools can read and trust your site. It does not measure whether an AI tool does name you. To measure that, you must track real questions in AI tools over time.

How does A/GEO Answers answer a question?

A/GEO Answers uses retrieval-augmented generation (RAG): it finds the matching parts of our public pages first, and then a model writes the answer from those parts only. A/GEO Answers is the engine behind the Ask A/GEO chat in our header.

  1. The visitor asks. The chat panel sends the question, the last few messages and the pages from this visit.
  2. Code checks the limits. The request must come from our domains. A Turnstile bot check runs once per chat.
  3. Jev sorts the message. Jev, a judgment model from TypeSafe, answers yes-or-no questions: Is it on topic? Is it only a greeting? Does it try to change the rules? What does the visitor want?
  4. Search finds our content. Cloudflare AI Search finds the five sections of our public pages that best match the question, by meaning and by keywords. A keyword search (BM25) inside the function is the backup.
  5. The model writes the answer. Claude Haiku 5.5 reads the rules, the five sections and the question. It writes 120 words or less. Llama 3.3 70B on Workers AI is the backup model.
  6. The visitor gets the answer and a next step. The answer streams word by word, with links to the source pages. Code adds one or two buttons, for example "Book a free discovery call".

How does A/GEO Answers guard against improper questions and private documents?

A/GEO Answers uses layers, and each layer stops one kind of problem. No single layer has to be perfect. The strongest layer comes first: private documents never enter the content that the chat can search.

The OWASP Top 10 for LLM Applications (2025) names the two main risks for a chat like this. The first is prompt injection: a message that tries to change the assistant's rules. The second is sensitive information disclosure: an answer that exposes data that the visitor must not see. The table shows how each layer answers these risks.

RiskGuardWhere it runs
The chat exposes a private documentThe build puts only public, indexable pages into the chat content. Password-protected proposals (/p/), the thank-you page and noindex pages never enter it. The model cannot quote a document that it never receives.Build script, before publish
A visitor asks about something else, such as homework or codeJev marks the message off topic. The chat sends a fixed reply. No search runs and no model writes.Judgment step
A visitor tries to change or reveal the rulesJev marks the attempt. The chat sends a fixed reply. The rules also tell the model not to follow such instructions and not to repeat the rules.Judgment step and system rules
The model answers from outside knowledgeThe model gets only the matched sections of our pages. It must not invent numbers, prices, clients or results. When the sections do not answer the question, it says so and offers a call.System rules
An answer sends a visitor to a bad linkCode removes links to other websites from answers. Code, not the model, picks the next-step buttons.Chat function
Bots or one person run up the billTurnstile, an origin check, 12 messages per chat in a signed token, 20 messages per hour and 60 per day per address, and an AI Gateway spend limit of $5 a day and $50 a month.Chat function and AI Gateway

The chat also has no live access to anything else. It does not read pages live, and it has no connection to our email, our CRM or our files. A page change reaches the chat at the next publish. The browser keeps the chat in the current tab only. Our privacy policy tells what we log and for how long.

We apply the same rule when we plan A/GEO Answers for client sites. Public site content and private sales documents, such as proposals and deal rooms, go into separate indexes. A public chat searches the public index only.

What proof supports this approach?

The main AI crawlers from OpenAI and Anthropic do not run JavaScript. Vercel measured AI crawler traffic on its network and published the results on December 17, 2024. ChatGPT's crawlers fetched JavaScript files in 11.50% of their requests, and Claude's in 23.84%. Neither ran those files. Of the crawlers in the study, only Google's (which Gemini uses) and AppleBot rendered JavaScript.

Crawler fetches in one month on Vercel's networkSource: Vercel, The rise of the AI crawler, December 17, 2024.
Googlebot (renders JavaScript)
4.5B
GPTBot (no JavaScript)
569M
Claude (no JavaScript)
370M
AppleBot (renders JavaScript)
314M
PerplexityBot (no JavaScript)
24.4M

GPTBot, Claude, AppleBot and PerplexityBot together made about 1.3 billion fetches, a little over 28% of Googlebot's volume.

Content that appears only after a script runs is invisible to those crawlers. A static page sends the full text in the first response, so every crawler sees the same page.

Our own checks support the build too. On November 1, 2026, axe-core found zero accessibility issues on all 32 pages of this site. We tested light and dark themes at desktop and phone widths, with the chat panel and the contact panel open. You can run PageSpeed Insights on our home page to check the speed for yourself.

How can you apply this to your own website?

You do not need to rebuild your site to get most of the gain. AI visibility is one of the fastest and cheapest first steps for more leads, because it improves the pages that you already have. Do these five checks this week:

  1. Run the free AI Visibility Score on your home page. Fix the top three items first.
  2. Open the page source. In your browser, press Ctrl+U (Cmd+Option+U on a Mac). Search for your main heading and your phone number. If you cannot find them, AI crawlers cannot find them either.
  3. Open yoursite.com/robots.txt. Make sure that it does not block GPTBot, ClaudeBot or PerplexityBot, unless you chose to block them.
  4. Add Organization schema and a home page FAQ with FAQPage schema. On WordPress, the free A/GEO Schema Manager plugin adds schema at the page level.
  5. Before you add an AI chat, list your private documents. Keep proposals, price sheets and internal files out of the content that the chat can search. A rule in the prompt is not enough.

Consider a rebuild only when the checks show a deeper problem. Signs: a page builder hides most text behind JavaScript, plugins slow every page, or your pages do not turn visits into leads.

Want us to do the first fix? The $249 Starter Package adds schema and a home page FAQ with matching FAQPage schema, and we can install it for you. If you want a site like this one, or an A/GEO Answers chat on your own site, book a free discovery call. See also Website or multiple microsite builds that convert.

Common questions

Is a static website good for SEO and AI search?

Yes, when the pages are complete. A static page sends all of its text, headings and schema in the first response. Search engines and AI crawlers read it without running JavaScript. Most AI crawlers from OpenAI and Anthropic do not run JavaScript, so this matters for AI answers.

Can a static website have an AI chat assistant?

Yes. The pages stay static. A small server function answers the chat. On ageoresearch.com, a Cloudflare Pages Function at /api/chat finds the matching sections of our public pages, and an AI model writes the answer from those sections only.

What is A/GEO Answers?

A/GEO Answers is the answer engine behind the chat on ageoresearch.com. It answers visitor questions with facts from a website's public pages, shows the source pages and offers a next step, such as a discovery call or a free check. It uses retrieval-augmented generation (RAG).

Can the A/GEO Answers chat read private documents?

No. The build step puts only public, indexable pages into the chat's content. Private proposals, the thank-you page and pages marked noindex never enter it. The model can only use the sections that the search step gives it, so it cannot quote a document that it never received.

What does the AI Visibility Score check?

It runs 37 checks in 8 factors: AI crawler access, structured data, text that is readable without JavaScript, page basics, answer-ready content, business facts, discovery files and authority signals. It reads your home page, robots.txt, sitemap and llms.txt, and gives a score out of 100 with your top fixes.

Should I move my website off WordPress or another CMS?

Usually not as a first step. Most of the gain comes from fixes inside your current site: complete HTML, schema, a home page FAQ and open access for AI crawlers. Consider a rebuild when page builders hide text behind JavaScript, when plugins slow every page, or when you also need new pages that convert.

Sources

Find out what AI says about you.

We ask leading AI answer engines the questions your customers ask. Then we show you who they name, and what to fix first. The check is free.

Get a free AI visibility check

We ask leading AI answer engines the questions your customers ask. Then we send you a short report.

We use your details only to send your report and reply to you. See our privacy policy.