# Dash Improve My LLMs — the AI and crawler surface for Dash apps

> dash-improve-my-llms — the crawler, agent and SEO companion every Dash app mounts in one line: /llms.txt, /robots.txt, /sitemap.xml, bot detection, static-HTML prerender, an MCP bridge, per-vendor policy, the country guardrail and the operator policy panel. Flask, FastAPI and Quart. By Pip Install Python.

> **`dash-improve-my-llms` — the crawler, agent and SEO companion every Dash app mounts in one line.** By [Pip Install Python](https://2plot.dev).

A Dash app is a JavaScript shell. A crawler that fetches it gets an empty
`<div>`; an agent that reads it learns nothing; a search engine indexes a
loading spinner. This package closes that gap without asking you to change
how you write Dash.

---

## What it does

One call — `add_llms_routes(app)` — mounts the whole machine-facing surface:

| Surface | Who reads it |
|---|---|
| `/llms.txt`, `/llms-small.txt`, `/llms-full.txt` | agents pasted a URL, and the crawlers that follow it |
| `/<page>/llms.txt` | one page's prose, content-negotiated: Markdown for agents, rendered for browsers |
| `/robots.txt` | every crawler, generated from one vendor registry |
| `/sitemap.xml` | search engines, with priority inferred from your page tree |
| a static-HTML prerender | crawlers that do not run JavaScript — the actual fix for the empty `<div>` |
| an MCP resource per page | Claude, ChatGPT and any other MCP client, natively |

Installed here: **2.10.0** — this site reads the
number from the package that is actually serving it, never from prose.

---

## The three audiences

This site is organised the way the package is: by who is asking.

- **[MCP clients](/audiences/mcp-clients)** — an assistant that speaks MCP
  mounts your docs as a resource and reads them natively. No copying, no
  scraping, no context window spent on HTML.
- **[Web crawlers](/audiences/web-crawlers)** — Googlebot, ClaudeBot,
  GPTBot, PerplexityBot. Each gets a document rendered for it, under a
  policy you declare once and serve everywhere.
- **[Paste-to-chat](/audiences/llm-context)** — a person pastes your URL
  into a chat window. The assistant fetches prose, not a bundle.

---

## Control, not just discovery

Discovery is the floor. Since 2.7 the package is also the layer that decides
**who gets served at all**:

- **Per-vendor policy** — allow, block or meter each crawler by name. One
  fold drives `robots.txt` and the middleware, so what you publish and what
  you enforce cannot drift apart.
- **The country guardrail** — `configure_geo(deny_countries=[...])` answers
  451 on *every* surface for a listed country: pages, assets, the corpus,
  `robots.txt`, even the favicon. Compliance, uniformly applied.
- **The rate contract** — a stated ceiling on the corpus routes, enforced,
  failing open on any limiter error.
- **The operator panel** — a read-only, token-gated page showing the live
  effective policy of every surface, including which header resolved this
  request's country.

Each of those takes a **callable** as well as a static value, and the
callable is read per request. That is the seam this site's
control board writes through: flip a country on the
map, and the next request from it gets 451 — in every worker, with no
restart and no redeploy.

---

## Install

```bash
pip install dash-improve-my-llms[flask]      # or [fastapi], [quart], [all]
```

```python
import dash
from dash_improve_my_llms import add_llms_routes, LLMSConfig

app = dash.Dash(__name__, use_pages=True)

add_llms_routes(app, LLMSConfig(warn_missing_llms_doc=True))
```

That is the whole integration. Every page that defines a module-level
`LLMS_DOC` string is served verbatim at its own `llms.txt`; every page
without one is still indexed, still prerendered, still in the sitemap.

### Writing a page's prose

```python
# pages/pricing.py
LLMS_DOC = """
# Pricing

Three tiers. The free tier has no time limit.
"""
```

No layout walking, no extraction heuristics, no second copy of your docs to
keep in sync.

---

## Backends

Dash 4.1 made the server pluggable, and the package follows it: the same
surface under **Flask**, **FastAPI** and **Quart**, auto-detected. Nothing
in the list above is backend-specific, and the package's suite runs against
all three.

---

## Resources

- **PyPI**: [dash-improve-my-llms](https://pypi.org/project/dash-improve-my-llms/)
- **GitHub**: [pip-install-python/dash-improve-my-llms](https://github.com/pip-install-python/dash-improve-my-llms)
- **The network**: [2plot.dev](https://2plot.dev) indexes every component
  site that runs this package — including this one.
- **The live directory**: every peer site, and this host's own policy, on the [policy panel](/showcase/policy-panel)

### Community

- **GitHub**: [@pip-install-python](https://github.com/pip-install-python) ![GitHub](https://img.shields.io/github/followers/pip-install-python?style=social)
- **YouTube**: [2plot.ai](https://www.youtube.com/@2plotai?sub_confirmation=1) — build-alongs and component walkthroughs

---

## License

MIT License — see [LICENSE](https://github.com/pip-install-python/dash-improve-my-llms/blob/main/LICENSE) for details.

## Other sizes of this document

- [/llms-small.txt](https://llms.2plot.dev/llms-small.txt): compact briefing — start here if context is tight. (4.8 KB, ~1.2k tok)
- [/llms.txt](https://llms.2plot.dev/llms.txt): this document — the index you are reading. (13.9 KB, ~3.6k tok)
- [/llms-full.txt](https://llms.2plot.dev/llms-full.txt): every page's prose in one document — 12 pages. (241.8 KB, ~61.9k tok)

## Access policy

- Terms: these documents are free to fetch. A free account unlocks any gated document.
- Identity: agents may present a key by appending `?key=<value>` to any document URL. Get one: https://2plot.ai
- Rate: prefer ONE `/llms-full.txt` fetch over N per-page fetches. On 429, honour `Retry-After` and back off exponentially.
- Coordination: start at https://2plot.dev/llms.txt — one index enumerates every site; do not rediscover the network by crawling it.
- Crawler policy (mirrors /robots.txt): allowed: GPTBot, ClaudeBot, CCBot, Google-Extended, FacebookBot, Omgili, ByteSpider, Amazonbot, Applebot-Extended, meta-externalagent, AI2Bot, Diffbot, Timpibot, ImagesiftBot, ChatGPT-User, Claude-User, Claude-SearchBot, PerplexityBot, OAI-SearchBot, Perplexity-User, Googlebot, Bingbot, Slurp, DuckDuckBot, GoogleOther, Google-InspectionTool, Storebot-Google, AdsBot-Google.
- Accounting: every document read is logged with the requesting vendor (verified against published IP ranges where the operator publishes them). See https://2plot.dev/llms.txt

## Pages

Every page in this application. Each has a Markdown version at the `llms.txt` URL beside it.

- [Dash Improve My LLMs — the AI and crawler surface for Dash apps](https://llms.2plot.dev/): dash-improve-my-llms — the crawler, agent and SEO companion every Dash app mounts in one line: /llms.txt, /robots.txt, /sitemap.xml, bot detection, static-HTML prerender, an MCP bridge, per-vendor policy, the country guardrail and the operator policy panel. Flask, FastAPI and Quart. By Pip Install Python.
  - Machine-readable: https://llms.2plot.dev/llms.txt (13.9 KB, ~3.6k tok)
- [Paste-to-Chat](https://llms.2plot.dev/audiences/llm-context): What happens when a person pastes this site's URL into ChatGPT or Claude — and how to make sure the assistant fetches your prose instead of a JavaScript bundle.
  - Machine-readable: https://llms.2plot.dev/audiences/llm-context/llms.txt (3.5 KB, ~896 tok)
- [MCP Clients](https://llms.2plot.dev/audiences/mcp-clients): How an MCP-speaking assistant mounts this site's documentation as a resource and reads it natively — no scraping, no copying, no context window spent on HTML.
  - Machine-readable: https://llms.2plot.dev/audiences/mcp-clients/llms.txt (8.5 KB, ~2.2k tok)
- [Web Crawlers](https://llms.2plot.dev/audiences/web-crawlers): What Googlebot, ClaudeBot, GPTBot and PerplexityBot actually receive from this site — the policy verdict, the crawler document, and the headers, run in-process against the real page registry.
  - Machine-readable: https://llms.2plot.dev/audiences/web-crawlers/llms.txt (14.5 KB, ~3.7k tok)
- [Changelog](https://llms.2plot.dev/changelog): Version history of Dash Improve My LLMs, rendered from CHANGELOG.md.
  - Machine-readable: https://llms.2plot.dev/changelog/llms.txt (136.6 KB, ~35.0k tok)
- [Getting Started](https://llms.2plot.dev/getting-started): Install dash-improve-my-llms and mount the whole machine-facing surface of your Dash app in one line — llms.txt, robots.txt, sitemap.xml, a crawler prerender and an MCP bridge.
  - Machine-readable: https://llms.2plot.dev/getting-started/llms.txt (5.6 KB, ~1.4k tok)
- [Access & tiers](https://llms.2plot.dev/reference/access): Gate a page and its machine twin independently — the four verdicts, the two axes, the callable seam, and why the gate document is served instead of a 403.
  - Machine-readable: https://llms.2plot.dev/reference/access/llms.txt (6.3 KB, ~1.6k tok)
- [Configuration](https://llms.2plot.dev/reference/configuration): Every option on LLMSConfig, RobotsConfig and configure_seo — what each one does, what it defaults to, and the ones with consequences that are not obvious from the name.
  - Machine-readable: https://llms.2plot.dev/reference/configuration/llms.txt (9.3 KB, ~2.4k tok)
- [Geo guardrail](https://llms.2plot.dev/reference/geo): configure_geo — opt-in 451 on every surface for whole geographies, the header trust model, the fail-open postures, and the callable seam a control board writes through.
  - Machine-readable: https://llms.2plot.dev/reference/geo/llms.txt (24.8 KB, ~6.3k tok)
- [Operator panel](https://llms.2plot.dev/reference/panel): A read-only, token-gated page showing the live effective policy of every surface the package governs — and why it displays but never writes.
  - Machine-readable: https://llms.2plot.dev/reference/panel/llms.txt (4.6 KB, ~1.2k tok)
- [Policy Panel](https://llms.2plot.dev/showcase/policy-panel): This host's live effective policy — tiers, vendor verdicts, the hub ceiling, and the country guardrail as a world map — plus a simulator that resolves a hypothetical request through the real in-process logic.
  - Machine-readable: https://llms.2plot.dev/showcase/policy-panel/llms.txt (15.2 KB, ~3.9k tok)
- [Bot Policy Sandbox](https://llms.2plot.dev/showcase/robots-sandbox): Build a RobotsConfig with switches and watch the robots.txt it would generate, plus the per-vendor verdict table — against a throwaway config that never touches what this site serves.
  - Machine-readable: https://llms.2plot.dev/showcase/robots-sandbox/llms.txt (9.8 KB, ~2.5k tok)

## About The 2plot network

Open-source Dash component libraries by Pip Install Python. Each component has its own documentation site and its own llms.txt; 2plot.dev indexes all of them, and 2plot.ai is the hub.

Network index: [https://2plot.dev](https://2plot.dev/llms.txt)

## Network

Other applications in this network. Same operator; each one serves its own `/llms.txt` in this format.

- [2plot.ai](https://2plot.ai): Network hub and account origin.
  - Machine-readable: https://2plot.ai/llms.txt
- [2plot.dev](https://2plot.dev): Package index for every open-source component in the network.
  - Machine-readable: https://2plot.dev/llms.txt
- [Documentation boilerplate](https://boilerplate.2plot.dev): The markdown-driven documentation template every satellite site is built from.
  - Machine-readable: https://boilerplate.2plot.dev/llms.txt
- [dash-leaflet2](https://leaflet.2plot.dev): Leaflet 2 maps as Dash components.
  - Machine-readable: https://leaflet.2plot.dev/llms.txt
- [dash-mui-scheduler](https://muischeduler.2plot.dev): MUI X Scheduler — calendars and event scheduling for Dash.
  - Machine-readable: https://muischeduler.2plot.dev/llms.txt
- [dash-mui-charts](https://muicharts.2plot.dev): MUI X charts, tree views and time pickers for Dash.
  - Machine-readable: https://muicharts.2plot.dev/llms.txt
- [flexlayout-dash](https://flexlayout.2plot.dev): IDE-style dockable, resizable and floatable window panels.
  - Machine-readable: https://flexlayout.2plot.dev/llms.txt
- [dash-flows](https://flows.2plot.dev): Node-graph editors built on React Flow.
  - Machine-readable: https://flows.2plot.dev/llms.txt
- [dash-pannellum](https://pannellum.2plot.dev): 360° panorama and virtual-tour viewer.
  - Machine-readable: https://pannellum.2plot.dev/llms.txt
- [dash-emoji-mart](https://emojimart.2plot.dev): Emoji picker component.
  - Machine-readable: https://emojimart.2plot.dev/llms.txt
- [dash-email](https://email.2plot.dev): Email composition and delivery components.
  - Machine-readable: https://email.2plot.dev/llms.txt
- [dash-model-viewer](https://modelviewer.2plot.dev): 3D model viewer with AR support, built on Google's model-viewer.
  - Machine-readable: https://modelviewer.2plot.dev/llms.txt
- [dash-excalidraw](https://excalidraw.2plot.dev): Excalidraw virtual whiteboard and sketching canvas.
  - Machine-readable: https://excalidraw.2plot.dev/llms.txt

## Related projects

Projects by the same author on their own domains. Built on the same stack, but not part of the primary network.

- [Pirate's Bargain](https://piratesbargain.com): Deal aggregator built on the same Dash stack.
  - Machine-readable: https://piratesbargain.com/llms.txt
- [ai-agent.buzz](https://ai-agent.buzz): Agent tooling directory.
  - Machine-readable: https://ai-agent.buzz/llms.txt
- [2plot.media](https://2plot.media): Media and streaming, on the same Dash stack.
  - Machine-readable: https://2plot.media/llms.txt

## External references

Third-party documentation this project depends on or references. Not affiliated — listed so an agent can follow a dependency directly instead of searching for it.

- [Dash Mantine Components](https://www.dash-mantine-components.com): The UI component layer these docs are built with.
  - Machine-readable: https://www.dash-mantine-components.com/llms.txt
- [Plotly Dash documentation](https://dash.plotly.com): Upstream framework documentation.
  - Machine-readable: https://dash.plotly.com/llms.txt
