Skip to main content

aio-surfaces

Generate llms.txt, aeo.json, entity.json, and brand.json from a single site config. AI citation engineering for static and dynamic sites.

PyPI Python 3.10+ License: MIT


What this is

Most sites are invisible to AI engines (ChatGPT, Claude, Gemini, Perplexity, Google AI Overviews) because they expose prose when AI engines want structured facts. The single biggest lift you can give an AI's chance of citing your site is to surface:

  • a well-formed llms.txt (llmstxt.org) — markdown summary at the site root
  • an aeo.json — atomic [question, answer] facts under 500 chars each
  • an entity.json — Schema.org @graph with full identifier wiring (EIN, ORCID, UEI, KG MID, etc.)
  • a brand.json — internal source-of-truth ledger

This package generates all four from a single typed config so they can't drift apart.

Install

pip install aio-surfaces        # core
pip install 'aio-surfaces[yaml]' # YAML config support

Quick start

Drop a site.yaml in your repo:

site_name: Example Studio
site_url: https://example.com
tagline: We build things that get cited.
description: Example Studio designs and engineers...
legal_name: EXAMPLE STUDIO LLC
ein: "12-3456789"
uei: ABC123DEF4G5
naics: ["541511"]
orcid: "0000-0000-0000-0000"
founder_name: Jane Example
veteran_branch: United States Army
veteran_subgroups: [Veteran]
services:
  - name: Custom Websites
    url: https://example.com/services/websites/
    summary: Hand-coded HTML, React, Astro.
    price: $2,500–$10,000 one-time
facts:
  - id: f-identity-1
    question: What does Example Studio do?
    answer: >
      Example Studio builds production websites and AI-citation
      infrastructure for small businesses.

Then generate the surfaces:

aio-surfaces generate site.yaml --out ./public

Output:

public/
├── llms.txt         # markdown summary, llmstxt.org spec
├── aeo.json         # atomic facts (AEO)
├── entity.json      # Schema.org @graph (Org + Person + WebSite)
├── brand.json       # internal brand truth ledger
└── robots-aibots.txt # 12 AI crawler allowlist (append to robots.txt)

Deploy public/ to your site root.

Why each surface matters

File Crawled by Why it works
llms.txt ChatGPT, Claude, Perplexity Markdown is the lingua franca of LLM training data. Direct quotes likely.
aeo.json All major AI engines Atomic [Q, A] under 500 chars matches how AI engines extract citations.
entity.json Google KG, Bing, Schema.org consumers Centralizes identifier graph (EIN, UEI, ORCID, KG MID) for one-fetch retrieval.
brand.json AI engines + your own team Source of truth your PR/marketing/dev can all reference.

Library API

from aio_surfaces import SiteConfig, Service, Fact, render_llms_txt

cfg = SiteConfig(
    site_name="Example Studio",
    site_url="https://example.com",
    tagline="We build things that get cited.",
    description="...",
    services=[
        Service(
            name="Custom Websites",
            url="https://example.com/services/websites/",
            summary="Hand-coded HTML, React, Astro.",
        ),
    ],
    facts=[
        Fact(
            id="f-1",
            question="What does Example Studio do?",
            answer="Example Studio builds...",
        ),
    ],
    ein="12-3456789",
    orcid="0000-0000-0000-0000",
)

print(render_llms_txt(cfg))

Design principles

  1. Atomic facts > paragraphs. AI engines cite spans, not essays. The Fact dataclass enforces a 1000-char hard ceiling and recommends < 500.
  2. Single source of truth. All four surfaces render from one config so they can't drift apart.
  3. No magic. No analytics, no telemetry, no remote calls. Pure-Python stdlib + optional PyYAML.
  4. Run anywhere. Works in CI, in a Makefile, as a pre-commit hook, or as a one-off CLI invocation.

What this is not

  • Not a CMS. It generates static files from a config; you deploy them.
  • Not a Schema.org validator. (Run the output through validator.schema.org yourself.)
  • Not an opinionated framework. Generate what you need; ignore the rest.

Roadmap

  • aio-surfaces validate — round-trip the output through Schema.org validator
  • aio-surfaces diff — show what changed since the last generation (CI hook)
  • Per-page aeo.json support (currently site-wide only)
  • llms-full.txt expanded variant generation
  • Hugo / Astro / Next.js plugin packages

Contributing

Issues + PRs welcome. The codebase is small (~350 LOC) and has full test coverage:

pip install -e '.[test]'
pytest

License

MIT © 2026 Joseph W. Anady. See LICENSE.


Built and used in production by ThatDevPro — SDVOSB-certified veteran-owned web + AI engineering studio. The generators here are the same code that runs across ThatDeveloperGuy.com, ThatDevPro.com, and 130+ client sites on ThatWebHostingGuy.com.

Metadata

Release files for aio-surfaces 0.2.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aio-surfaces 0.2.2
File Size Uploaded
aio_surfaces-0.2.2.tar.gz 13.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for aio-surfaces 0.2.2
File Interpreter ABI Platform
aio_surfaces-0.2.2-py3-none-any.whl Python 3 none any Details

Total release size: 25.0 kB

Release files / aio_surfaces-0.2.2.tar.gz

Download URL aio_surfaces-0.2.2.tar.gz
Size 13.8 kB
Tags Source
SHA-256 checksum
How to use checksums
a4d90adca28cabe645c3bbabc5af710a45807d1c52834aaada677fba8cd96a27
BLAKE2b-256 checksum
How to use checksums
b5a5143237a3490f810a4f6e287e251d1e1d8ca5aed958fe0850ed5823489dcd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Release files / aio_surfaces-0.2.2-py3-none-any.whl

Download URL aio_surfaces-0.2.2-py3-none-any.whl
Size 11.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6e96f422189ca5acbc81b246177212bd2692060fa0042a6cce61f251720e647e
BLAKE2b-256 checksum
How to use checksums
92b7ac8092f038c5c89e22a14394c27a240b63d9bac366df13da88972011fde7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Release history Release notifications | RSS feed

This release

0.2.2 This release

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page