Colophon
This page tells how this website and its chat assistant, Ask A/GEO, are built. It names each part, tells what the part does, and links to the documentation for that part.
For the reasons behind the build, read How We Built ageoresearch.com Without a CMS. For the full stack on one page, get the tech stack PDF.
Last updated: November 2, 2026
In short
Ask A/GEO runs on A/GEO Answers, our answer engine. It answers questions with facts from this website. It finds the parts of our pages that match the question. Then an AI model writes a short answer from those parts only. Code picks the next step, for example a free AI visibility check or a discovery call. Limits on bots, messages and spend protect the chat.
How the chat answers one question
- You ask. The chat panel sends your question, the last few messages, the page you are on and the pages you looked at during this visit.
- We check the limits. The request must come from our website. A bot check runs once per chat. Each chat and each network address has a message limit.
- We sort the message. A judgment model answers yes-or-no questions about the message: is it on topic, what do you want, is it a greeting. Simple messages get a fixed reply with a link, and no other AI model runs.
- We find our content. A search service finds the five sections of our website that best match the question.
- The model writes the answer. Our main model reads the rules, the five sections and your question. It writes an answer of 120 words or less. A gateway between our code and the model logs each call and stops calls when a spend limit is reached.
- You get the answer and a next step. The answer appears word by word, with links to the source pages. When a next step fits, the answer ends with a link to it. A contact link opens our contact form with your first question already in the message field.
Our models
The chat uses three AI models. Each one has one job.
- Claude Haiku 5.5, by Anthropic Main model
- Writes the answers. It gets our rules, the matching sections of our website and your question. It must use only facts from our website. It must not invent numbers, prices, clients or results. It must not promise that an AI tool will name your business. Under its commercial terms, Anthropic does not use these messages to train its models.
- Claude Haiku 5.5 docs (opens in a new tab) Streaming messages (opens in a new tab) Service account keys (opens in a new tab)
- Llama 3.3 70B on Cloudflare Workers AI Backup model
- Writes the answer only when Claude is not available, for example when the daily spend limit for Claude is reached. It gets the same rules and the same content.
- Workers AI docs (opens in a new tab) Model page (opens in a new tab)
- Jev, by TypeSafe Judgment model
- Does not write text. It answers typed questions about each message with probabilities: is the message on topic, is it only a greeting, does it try to change the assistant's rules, what does the visitor want, what kind of organization is it. Our code reads these answers and decides the route. The decision rules sit in our code, where we can test them.
- Jev docs (opens in a new tab) Question types (opens in a new tab) How to build with Jev (opens in a new tab)
How the chat uses this website
- The chat knows only the public pages of this website. Private proposals, the thank-you page and pages marked "noindex", such as this one, are not in its content.
- Each time we publish the site, a build script copies the main text of each public page into short sections. It leaves out menus, forms and repeated buttons.
- The chat does not read pages live. A page change reaches the chat with the next publish.
- The chat shows only links to pages on this website. It drops links to other websites.
- The chat shows links to this website only. It removes links to other websites from answers.
- Your browser keeps the chat for this tab only. Our privacy policy tells what we log and for how long: Site chat in the privacy policy.
What each part does
Domains, hosting and code
- Cloudflare DNS
- Holds the records for our three domains: ageoresearch.com, ageo.agency and localaipresence.com. All three point to the same Cloudflare Pages project. Code sends ageo.agency and the www addresses to ageoresearch.com with a 301 redirect, so each page has one address.
- DNS docs (opens in a new tab) Custom domains (opens in a new tab)
- Cloudflare Pages
- Hosts the website. Each change to our code repository starts a new build and publish.
- Pages docs (opens in a new tab)
- Pages Functions
- Small server programs that run on Cloudflare's network, near the visitor. The chat runs at /api/chat, the AI Visibility Score at /api/scan, the forms at /api/form and the playbook emails at /api/playbook. One more function guards the private proposal pages with a password. No server needs care from us.
- Pages Functions docs (opens in a new tab) Bindings and secrets (opens in a new tab)
- Cache API
- Usually keeps copies of pages. Here it also keeps each AI Visibility Score result for one hour, and it counts messages and form posts from each network address, so one person cannot flood the chat or the forms.
- Cache API docs (opens in a new tab)
Finding the right content
- Retrieval-augmented generation (RAG)
- The main method. The chat first finds the parts of our website that match the question. Then it asks the model to answer from those parts only. This keeps answers tied to our real content.
- What is RAG (opens in a new tab)
- R2
- Cloudflare's file storage. It keeps one text file for each page of this website.
- R2 as a data source (opens in a new tab)
- Cloudflare AI Search
- Cuts the files into chunks and stores embeddings: number codes for meaning. It finds sections by meaning and by keywords, so it matches questions that use words different from the page.
- AI Search docs (opens in a new tab)
- BM25 keyword search
- A classic formula that ranks text by keyword matches. It runs inside the chat function as a free backup, so the chat still finds content when AI Search is not available.
- About BM25 (opens in a new tab)
- GitHub Actions
- An automatic job. After each change to the website, it sends the new page text to R2, so the chat stays current.
- GitHub Actions docs (opens in a new tab)
Safety and cost limits
- Cloudflare Turnstile
- An invisible bot check. It replaces the old "click the traffic lights" puzzles. It confirms once per chat that a person is typing. Our server checks the result before the chat answers.
- Turnstile docs (opens in a new tab) Server-side check (opens in a new tab)
- Cloudflare AI Gateway
- A checkpoint between our code and the AI models. It logs each call, limits how many calls arrive each minute, and blocks calls when a dollar limit is reached for the day or the month. A token protects it, so only our chat can use it.
- AI Gateway docs (opens in a new tab) Spend limits (opens in a new tab)
- Signed session token
- A small ticket that our server signs with a secret key (HMAC with SHA-256). It counts the messages in one chat, so each chat stops at 12 messages. A changed ticket fails the check. No database is necessary.
- Web Crypto sign() (opens in a new tab)
- Message limits
- A message can have up to 1,000 characters. The rules keep each answer under 120 words, and the model thinks briefly before it writes. The model sees only the last 6 messages. Each network address can send up to 20 messages per hour and 60 per day.
- Origin check and on switch
- The chat accepts messages only from our own websites. One setting turns the chat on or off without a code change.
What you see
- Lazy loading
- The chat code loads only when you click the chat button. Pages stay fast for people who do not use the chat.
- About lazy loading (opens in a new tab)
- Session storage
- Your browser keeps the chat and the list of pages from this visit. Both stay in this tab only and go away when you close the tab.
- sessionStorage docs (opens in a new tab)
- Server-sent events
- The server sends the answer in small pieces, so you see it word by word and do not wait for the full answer.
- Server-sent events docs (opens in a new tab)
- AG-UI protocol
- An open standard for the messages between an AI agent and a user interface: run started, text, custom data, run finished. Our chat uses its event names, so other agent interfaces can read the same stream.
- AG-UI events (opens in a new tab)
How we tested it
- Wrangler
- Cloudflare's command-line tool. We used it to run the full website and the chat function on a local computer.
- Wrangler docs (opens in a new tab)
- Mock servers
- Small stand-ins for the AI models. They let us test each route of the chat without paid calls: answers, fixed replies, failures and limits.
- Playwright
- A browser robot. It opened the chat, asked questions and clicked the links on desktop, tablet and phone sizes, in light and dark themes.
- Playwright docs (opens in a new tab)
Accessibility (A11y)
We build every page so that people who use a keyboard, a screen reader or large text can use it. We check the website with automated tests, and we fix each issue before we publish.
- axe-core, by Deque
- An open-source engine that checks a page against the Web Content Accessibility Guidelines (WCAG). Lighthouse uses the same engine for its accessibility score. On November 1, 2026, axe found zero issues on all 32 pages of this website: in light and dark themes, at desktop and phone widths, and with the chat panel and the contact panel open.
- axe-core (opens in a new tab) Lighthouse accessibility score (opens in a new tab)
- WCAG 2.2
- The standard we test against, at level AA. It covers text contrast, names for buttons and links, heading order, keyboard access and more.
- WCAG 2.2 (opens in a new tab)
- Checks in our build
- The build stops when a page has two elements with the same id. Duplicate ids break the links between labels and the fields they name.
- What we build in by hand
- Text sizes in rem units, so text scales with the browser setting. Contrast of 4.5:1 or more for body text. Every scroll box can get keyboard focus. Animations stop when your device asks for less motion, and the data flow animation has a Pause button.
The website itself
- Static HTML
- A small build script with no outside packages turns our page files into plain HTML. Plain HTML loads fast, and AI crawlers and search engines can read every page without running scripts.
- Structured data and llms.txt
- Each page carries schema.org markup in JSON-LD, such as Organization, Service and FAQPage. An llms.txt file gives AI tools a short summary of the website.
- schema.org guide (opens in a new tab) llms.txt (opens in a new tab)
- Type
- Roboto for headings, Open Sans for text and JetBrains Mono for figures. We serve the font files from our own website. All type sizes use rem units, so text scales with the screen and stays easy to read.
- Roboto (opens in a new tab) Open Sans (opens in a new tab) JetBrains Mono (opens in a new tab)
- AI Visibility Score
- Our free scanner. It reads the home page, robots.txt, sitemap and llms.txt of a public website, runs 37 checks in 8 factors and gives a score out of 100. It reads the HTML as text and does not run scripts, the same way most AI crawlers read a page. It scans public addresses only, stops after 8 seconds and follows 5 redirects at most.
- Forms
- Every form on this website posts to our own function at /api/form. No outside form service is necessary. The function checks the origin, a hidden bot trap and the email address. Then it sends the request to us. When you reply to that email, the reply goes straight to the person who sent the form.
- Resend
- Sends all of our email from our own domain: the lead alerts from the forms and the playbook emails. It also keeps each contact as the lead record. People who do not ask for updates stay unsubscribed, so they get no newsletters.
- Resend docs (opens in a new tab) Contacts (opens in a new tab)
- Stripe Payment Links
- Takes payment for the $249 Starter Package on Stripe's own checkout page. We do not see or keep card details.
- Payment Links docs (opens in a new tab)
- Cloudflare Web Analytics
- Counts page views and page speed without cookies. It does not identify you or follow you to other websites.
- Web Analytics docs (opens in a new tab)
Watch one question move through the system
The animation follows one question from the chat panel to the answer. Each step lights up when the question reaches it. The cards on the right show the two side paths: the fixed reply that stops early, and the page text that feeds the search.
-
Chat panel · session storageYou ask a questionThe panel sends the question, the last messages, this page and the pages from your visit.
-
Pages Functions · Turnstile · Cache API/api/chat checks the limitsOur website only, a person once per chat, 12 messages per chat, 20 per hour per address.
-
TypeSafe JevJev sorts the messageOn topic? Only a greeting? A change to the rules? What do you want? Code reads the answers and picks the route.No search, no modelFixed reply and a linkGreetings, off-topic questions, rule changes, "contact us" and "check my site" stop here. For "contact us", the chat asks three short questions, then "Ready to submit?". A yes sends your details to us by email.
-
AI Search · BM25 backupSearch finds our contentThe five sections of our website that best match the question, by meaning and by keywords.Build script · GitHub Actions · R2At each publishThe text of each public page goes to R2. AI Search cuts it into chunks and stores embeddings.
-
AI GatewayThe gateway checks the budgetIt logs the call, limits calls per minute and blocks calls after $5 a day or $50 a month.
-
Claude Haiku 5.5 · Workers AI backupThe model writes the answerIt uses only the five sections and our rules. It writes 120 words or less.
-
Server-sent events · AG-UIYou get the answer and a next stepThe answer appears word by word, with source links and buttons. A contact button opens our form with your question in it.
Tech stack on one page: Download the PDF
Lighthouse report: See the PageSpeed Insights result for ageoresearch.com (desktop) (opens in a new tab)
Questions about how we built this site? Send us a message. We build the same kind of AI search and chat systems for our clients.
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.