AI search engines such as ChatGPT search, Perplexity, Copilot and Google’s AI features answer from pages they can crawl, read and trust. On bitnoda.team that meant five concrete changes: content in pre-rendered HTML, AI crawlers explicitly allowed, one consistent JSON-LD entity graph, an llms.txt generated from the site’s own copy, and sitemap dates that reflect real edits. None of them guarantees a citation; together they remove the reasons not to be cited.
Start with what AI crawlers can actually read
Many AI crawlers do not run JavaScript. If a page’s text only appears after the app runs in the browser, to them the page is empty. That is why every page on this site is pre-rendered as HTML; we wrote about it in the article on pre-rendering a 3D site.
Allow the right bots, and mind the robots.txt trap
AI bots are not all the same. OpenAI states that sites which opt out of OAI-SearchBot are not shown in ChatGPT search answers. Google states that Google-Extended does not affect inclusion in Search. We allow all of them, training bots included, because the site holds nothing private.
The trap: a crawler obeys only the most specific robots.txt group that names it. Add a separate “User-agent: GPTBot / Allow: /” group and the Disallow rules in the * group no longer apply to that bot. On bitnoda.team every named bot sits in a single group together with *, under the same rules.
One entity, described the same way everywhere
The JSON-LD structured data forms one graph: the organisation has a single @id, the founder has his node on the About page, each service page defines its service with an @id, and the market pages and case studies point to them by @id instead of redefining them. The countries served are linked to their Wikidata entities.
There was also a practical problem: an unrelated domain with a similar name has a poor reputation online. So that engines don’t blend the two, the organisation carries alternateName: bitnoda.team and a description that ties the name to the domain, and outside profiles use the form “Bitnoda (bitnoda.team)”.
Pages that each answer one question
Service and market pages open with a one-sentence definition: who, what, for whom and where. The title and H1 use the words people search with, such as software development team in Moldova. Questions and answers are visible and sit in the HTML, in native details elements, not loaded later by JavaScript.
llms.txt: cheap, but not magic
We generate /llms.txt and /llms-full.txt on every build, from the same content files as the pages, so they cannot state different facts. Google’s guide to its AI features says, however, that Google Search does not use such files. We keep them for the agents and assistants that do read them, not as a shortcut to rankings.
Honest freshness signals
Google uses a sitemap’s lastmod only if it is consistently and verifiably accurate. On bitnoda.team, each URL gets the date of the last git commit that changed its template or its copy, not the build date. We never bump dates without real changes.
What a website cannot do on its own
For prompts like “best software development company in Moldova”, engines lean mostly on directories and verified reviews, not on the company’s own site. That part is built off-site, with consistent profiles and real reviews. We measure progress monthly with a fixed set of prompts, run several times on each engine, because AI answers vary from one run to the next.
Sources
- OpenAI: OpenAI crawlers (OAI-SearchBot, GPTBot, ChatGPT-User)(opens in a new tab)
- Google: common crawlers, including Google-Extended(opens in a new tab)
- Google: robots.txt specification(opens in a new tab)
- RFC 9309: Robots Exclusion Protocol(opens in a new tab)
- Google: build and submit a sitemap (lastmod)(opens in a new tab)
- Google: optimizing for generative AI features(opens in a new tab)
- llmstxt.org: the llms.txt proposal(opens in a new tab)
- Vercel: The rise of the AI crawler(opens in a new tab)