How Doozer makes itself legible to AI agents and AI-powered search (ChatGPT, Perplexity, Claude, Gemini, Copilot, DuckDuckGo). The DDG=Bing insight, the explicit crawler welcome, llms.txt, and the machine-readable stack (schema.org JSON-LD + Atlas + design.md) that already existed.
The [[the-observed-world]] endgame is that AI agents are the new observers: they ask "is there a good X near me?" and Doozer should always be able to answer "yes, here it is, with structured data." This node is how a Doozer host makes itself legible to AI and AI-powered search.
DuckDuckGo does not run its own web index. Its results are overwhelmingly Bing-sourced (plus DuckDuckBot for a little, Apple Maps for local). So "optimize for DuckDuckGo" mostly means "be in Bing" — which the existing [[indexnow]] pipe already does (instant Bing submission on publish; verified healthy, HTTP 202s flowing). Same logic extends to the AI assistants: ChatGPT search, Copilot, and DuckAssist all lean on Bing's index. IndexNow is therefore the single biggest AI-search lever, and it was already built. The gap was the AI-native layer below.
Every Doozer business page already emits, and now advertises, structured data:
schema-org.php) — type-specific(FastFoodRestaurant, PostalAddress, GeoCoordinates, AggregateRating, opening hours). The single richest signal for both rich results and AI extraction.
/.well-known/doozer-atlas (JSON) — the per-entity outward emission,linked in <head> via <link rel="alternate" type="application/json">.
/design.md (Google-Labs DESIGN.md) — agent-facing brand spec, `<link rel="alternate"type="text/markdown"> in head, X-Robots-Tag: noindex`.
/llms.txt (includes/llms-txt.php, the llmstxt.org convention) — a concise Markdown cardserved per domain that hands an agent a plain-language "here's what this is" plus links to all of the above. Four shapes: master (the network), nbmn (the directory), root (a directory root like elks.club/westmilford.biz — isRootWildcardDomain(), reads its root_domains name/tagline/ description), and business (pulls real name/niche/city from domains→businesses, generic fallback if unresolved). Routed in index.php next to robots/design.md, in the sessionless + drain-skip fast paths. Gotcha caught v2.2.421: roots front many businesses, so they must NOT fall through the business branch (it would mislabel a whole directory as one local business).
doozerAiCrawlers() (GPTBot, OAI-SearchBot,ChatGPT-User, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended, Applebot, Bingbot, DuckDuckBot, DuckAssistBot, Amazonbot, Meta-ExternalAgent, CCBot, …). User-agent: already allowed them; naming them is an intentional "yes, index us" (most of the web blocks these). Emitted only on business + NBMN (no Disallows to bypass); the master keeps authoritative so its admin Disallows bind every bot, and just advertises the llms.txt summary line.
Most sites are racing to block AI crawlers. Doozer does the opposite: the whole model is that every observed business should be findable, and being the structured local layer AI agents cite and route through may be a bigger business than the sites themselves ([[the-observed-world]]). So we roll out the welcome mat and hand agents citable data. Guardrail: the data must be true and current before we invite citation — the quality gate ([[the-mission]]) still governs what gets indexed and enriched; we never advertise a thin skeleton.
curl the live surfaces on a real host: /llms.txt, /robots.txt, /.well-known/doozer-atlas, and grep the homepage for application/ld+json. Per [[feedback_verify_by_looking]], confirm on live pixels/bytes, since a legacy path can silently no-op.
Related: [[indexnow]] (Bing pipe), [[atlas]] (outward emission), [[the-observed-world]] (agents as observers), [[seo-cliff-recovery]] (only index what is real).
The whole knowledge bundle is live at four addresses on doozer.work, rendered from the knowledge/ files on every request (15-minute cache), so deploying a node updates it:
| form | address | robots |
|---|---|---|
| HTML index, start here | https://doozer.work/brain.html |
none; ~30KB, one link per node |
| HTML, one page per node | https://doozer.work/brain/<node>.html |
none; ~5 to 20KB each, cross-links rewritten, prev/next |
| HTML, everything on one page | https://doozer.work/brain-full.html |
none; ~420KB, for readers that can take it |
| Markdown | /brain |
noindex, noarchive (shareable, not a search result) |
| plain text | /brain.txt |
noindex |
| JSON | /brain.json |
noindex |
The HTML forms exist because most agent fetchers choke on text/markdown, on an extensionless URL, on a single 450KB document, or treat noindex as "do not read". The server was never at fault (every form returned the right type); the SHAPE was. Give an agent the index and it can walk the pages it needs. The operator's rule: it is not open source, and it is not the secret recipe; hand the .html address to an agent and it reads everything, with a table of contents.