How to serve /llms.txt when your host won't let you upload a .txt file
You created llms.txt, published it, and curl https://yoursite.com/llms.txt still returns a full HTML page. That is the closed-host problem — not a bad file.
CiteKit supplies files and instructions. Installing them may require a paid plan, a custom domain, custom code or separate hosting; those costs are not included. Platform features change, so check your current plan before buying.
The symptom
A working root brief starts with an H1 in plain text:
# Your site name > One-line summary…
On Framer, Webflow, or Carrd you often get something closer to:
<!DOCTYPE html> <html>…marketing page…</html>
Status may still be 200. Agents that expect markdown at /llms.txt do not get a brief.
Why this happens
These builders treat almost every path as an HTML route. There is often no public directory where a raw .txt is served at the origin root. That is a product constraint, not a CiteKit claim about rankings or citations.
What has to be true
| File | Public URL | Verify |
|---|---|---|
llms.txt | https://yoursite.com/llms.txt | first line is # + site name |
schema.jsonld | appropriate page <head> as application/ld+json | view-source / validator of your choice |
faq.md | optional public FAQ page; keep in sync with schema | same Q&As as JSON-LD |
Framer
Framer does not give you a reliable static root for arbitrary text files. Practical options:
- Put a reverse proxy or CDN rule in front of the custom domain so
/llms.txt(and optionally/faq.md) are served as plain text from object storage or a tiny worker. - Paste Organization + FAQPage JSON-LD in Site Settings → Custom Code → End of <head>.
- Do not rely on “upload a page named llms.txt” — that usually still wraps HTML.
Webflow
Same class of limit: the designer publishes HTML routes. Practical options:
- Reverse proxy / 301 / CDN rule that serves a hosted
.txtat/llms.txton the apex (or www — pick one host and stick to it). - Paste JSON-LD in Project Settings → Custom Code → Head Code.
- If
/llms.txt200s but the body is your homepage, you still have the HTML-fallback failure.
Carrd
Carrd is even more constrained: there is no general root-file upload for arbitrary .txt on every plan. Say so before you buy a zip. Honest paths are (a) a proxy/CDN rule on a custom domain you control, or (b) move the marketing site to a host that can publish static files at the origin root. CiteKit’s stack README may fall back to generic install steps for Carrd — we do not invent a native upload UI that does not exist.
An option when your domain supports a proxy
Put a CDN or worker in front of the domain. Match /llms.txt (and optionally /faq.md / /schema.jsonld if you host them as files) and return the file bytes with a text content-type. Keep the builder for the HTML site; use the edge only for the brief. High level only — use your CDN’s docs for the exact rule syntax.
Common failures
- SPA / builder HTML fallback on a “missing” path
- Wrong hostname (
wwwvs apex) - Stale CDN cache after you replace the file
- Redirect loops between proxy and origin
- FAQ markup placed on pages where the corresponding answers are not visible
Review generated facts and keep FAQ markup on pages where those answers are visible. A proxy must fit your host, domain and TLS setup; it is not guaranteed to be available on every plan.
Verify
curl -s https://yoursite.com/llms.txt | head # First line must be: # Your site name
Wrong vs right: HTML doctype or nav chrome means it is not installed. A leading # H1 means the brief is fetchable.
What to put in the file
See a finished four-file example on /sample (also download the zip). Spec shape: one H1, a short blockquote, H2 sections with absolute URLs — not a sitemap dump. Spec: llmstxt.org.
You may not need CiteKit
If WordPress (Yoast, Rank Math) or a docs platform already serves a real /llms.txt, use that. CiteKit is for indie marketing sites on closed hosts that do not get one.