Put it to work

AI visibility (AEO)

Get your business accurately described and cited by ChatGPT, Perplexity and Google's AI.

Your customers increasingly ask an AI — ChatGPT, Perplexity, Google's AI Overviews, Gemini — instead of typing a search. When they ask "what does [your business] do?" or "does it offer X?", the AI answers from whatever it can find about you. AI visibility (also called AEO — answer-engine optimization, or GEO — generative-engine optimization) is about giving those engines an accurate, structured description from you, so the answer is right and cites your site.

Kelma already holds your business knowledge, so it builds the two artifacts answer engines read:

  • llms.txt — a plain-text profile at a standard location (llmstxt.org) that AI crawlers look for: your name, a business summary, your key pages, and an FAQ.
  • FAQPage JSON-LD — schema.org structured data, the exact format Google rich results and AI answers pull from.

How to set it up — Channels tab → AI visibility

1. Generate your AI profile. Press Generate. Kelma reads your knowledge base and writes a concise, factual business summary and a set of FAQ pairs (grounded only in what your agent knows — it won't invent facts). Review the summary; re-generate after any big change to your knowledge. This is the step that makes the output genuinely useful — it doesn't rely on you hand-writing Q&A.

2. Publish the files. Flip the toggle on. Kelma serves two public URLs (only content that's already public is ever included):

  • …/api/aeo/<id>/llms.txt
  • …/api/aeo/<id>/faq

3. Point your site at them.

  • llms.txt — it has to end up at yourdomain.com/llms.txt. See Hosting llms.txt below for your exact platform.
  • FAQ JSON-LD — press Copy <script> snippet; it grabs the current JSON and gives you a ready <script type="application/ld+json">…</script> tag. Paste it into the <head> of your FAQ or home page. (Google wants the JSON inline, so re-copy after you re-generate.)

Hosting llms.txt

The rule: it only counts at your own root path. Crawlers look for yourdomain.com/llms.txt — nothing checks the Kelma URL on its own. So the Kelma URL has to be served through your domain. You have two ways to do that, and which one you can use depends entirely on your platform.

Option A — proxy (preferred). Your server fetches the Kelma URL and returns it as /llms.txt, with a 200. The visitor and the crawler only ever see your domain. This is the better option because the file stays current by itself — re-generate in Kelma and your site serves the new text immediately, with nothing to re-paste.

Option B — paste the text. Press Copy file contents in the AI visibility card and paste it into a file on your site. Works anywhere, but it's a snapshot — you must re-paste after every re-generate.

(A plain 301/302 redirect to the Kelma URL does technically work — GPTBot, ClaudeBot and PerplexityBot all follow cross-domain redirects — but prefer a proxy where you can: it keeps the file at the canonical root path, and crawlers give up on chains longer than about two hops.)

In every snippet below, swap the URL for your own — press Copy next to llms.txt in the AI visibility card; it already contains your agent's id.

Vercel — in vercel.json:

{
  "rewrites": [
    { "source": "/llms.txt", "destination": "https://kelma.chat/api/aeo/YOUR_ID/llms.txt" }
  ]
}

Netlify — in _redirects (the 200 is what makes it a proxy rather than a redirect). Put it above any catch-all /* /index.html 200 rule or it'll never match:

/llms.txt  https://kelma.chat/api/aeo/YOUR_ID/llms.txt  200

Cloudflare (also the way to add /llms.txt to a locked-down host like Squarespace or Wix — put Cloudflare in front of it) — a Worker or Snippet on your zone:

export default {
  async fetch(request) {
    const url = new URL(request.url)
    if (url.pathname === "/llms.txt") {
      return fetch("https://kelma.chat/api/aeo/YOUR_ID/llms.txt")
    }
    return fetch(request)
  },
}

nginx:

location = /llms.txt {
    proxy_pass https://kelma.chat/api/aeo/YOUR_ID/llms.txt;
    proxy_set_header Host kelma.chat;
}

Apache — in .htaccess at your document root (needs mod_proxy; the [P] is what proxies instead of redirecting):

RewriteEngine On
RewriteRule ^llms\.txt$ https://kelma.chat/api/aeo/YOUR_ID/llms.txt [P,L]

WordPress — easiest is to press Copy file contents, save it as llms.txt, and upload it to your web root over SFTP (the folder holding wp-config.php). Re-upload after re-generating. On WordPress.com this needs a Business plan or higher; below that there's no root access.

Shopify — Shopify now serves /llms.txt itself and ignores URL redirects on that path, so a redirect won't work. Override it with a theme template instead: Online Store → Themes → Edit code → Templates → Add a new template, name it llms.txt, and paste the Copy file contents output in. (Shopify is moving toward agents.md as the canonical file — if you see it, add an agents.md template with the same content.)

Squarespace, Wix, Webflow — none of these can serve a plain-text file at an arbitrary root path. Webflow and Wix can 301 /llms.txt to the Kelma URL, which crawlers will follow; for a proper 200 at your own root, put Cloudflare in front (see above). If neither is an option, skip llms.txt and rely on the FAQ JSON-LD — you can paste that into any of them via custom code injection, and it's the better-supported artifact anyway.

Check it worked

Visit yourdomain.com/llms.txt in a browser — you should see your business summary as plain text, on your own domain, with no redirect bar. If you get your site's 404 page, the rule isn't matching (on Netlify, that's almost always a catch-all rule above it). For the JSON-LD, paste your page URL into Google's Rich Results Test.

What to expect

Be realistic about the two artifacts, because they're at very different stages of adoption:

  • FAQ JSON-LD is the one that pays off today. schema.org structured data is long-established, Google reads it, and it feeds both rich results and AI answers. If you only do one, do this.
  • llms.txt is a bet on where things are going. It's a young convention — roughly one site in ten uses it, and Google has said publicly it doesn't use it as a search signal. Perplexity has confirmed it reads it, and AI coding agents and dev tools use it routinely. It costs you one config line, and it's what agents will reach for as they get more autonomous — but don't expect it to move your rankings on its own.

Keeping it accurate

The files regenerate their pages list automatically as your knowledge re-syncs, but the summary and FAQ are snapshots from when you pressed Generate — so after materially changing your knowledge, re-generate to refresh them. Any Q&A pairs you curate by hand are merged in first (they take priority over the generated ones), so your exact wording wins where you've written it.

This is the mirror image of the rest of Kelma: instead of your agent answering your visitors, it makes the other AIs answer questions about you correctly.