5.4 KiB
AGENTS.md
Guidance for AI coding agents working in this repository. This is the Hugo site behind qdrant.tech: the marketing pages, the blog, and the documentation.
This file is about editing the repository. It is not the agent-facing entry
point for the published site, which is
qdrant.tech/llms.txt, generated from
themes/qdrant-2024/layouts/index.llms.txt.
Build and serve
./run.sh # npm install, then hugo serve on :1313
./install-and-build.sh # what Netlify runs: fetches Dart Sass, builds to public/
Three things about the build cause more lost time than everything else combined:
- Hugo 0.160.1 exactly.
install-and-build.shrefuses any other version andrun.shwarns. A different version produces failures that look like content bugs. - Dart Sass is required, and the npm package named
sassis not it. It is a different implementation. Without Dart Sass onPATH, Hugo still reports a successful build and serves stale CSS out ofqdrant-landing/resources/_gen. A panel that renders unstyled after an SCSS change almost always means this rather than a mistake in the SCSS. hugo --quiethides build errors. It has reported exit 0 through a pipe while the site failed to render. Grep unpiped output forERRORbefore trusting a green build.
Layout of the repository
| Path | What it holds |
|---|---|
qdrant-landing/content/ |
All content. documentation/ is the docs tree |
qdrant-landing/content/headless/, .../documentation/headless/ |
Page bundles that are never published as URLs: code snippets, prompts |
qdrant-landing/themes/qdrant-2024/ |
The theme: layouts, shortcodes, SCSS, JS |
qdrant-landing/layouts/ |
Project layouts, which override the theme's |
automation/ |
Checks and generators, each with its own README |
.github/workflows/ |
CI |
qdrant-landing/public/, qdrant-landing/resources/_gen/, and node_modules/
are generated and git-ignored. Never edit them, and never cite a path under
public/ as the source of anything.
Project layouts win over theme layouts, which is why layouts/shortcodes/
holds the per-output-format variants while the theme holds the HTML ones.
Every page has two outputs
A content page renders as HTML and as Markdown at <url>/index.md. The Markdown
output is what AI agents consume, and qdrant.tech/llms.txt indexes it. It is
not a format conversion of the HTML: layouts/_default/single.markdown.md
prepends pointers to the skills catalog and rewrites internal links to their
index.md form.
So a change to a page changes two published artifacts. When a shortcode should
behave differently for agents, give it a <name>.markdown.md variant in
layouts/shortcodes/ rather than trying to detect the format inside the HTML
one. code-snippet, include, prompt, and prompt-index all do this.
Content conventions
weightin front matter orders the docs sidebar. Adding a page without one puts it in an unpredictable position.- Moving or renaming a page needs
aliasesin the destination's front matter. Old URLs are linked from blog posts, from articles, and from the pointers prepended to every documentationindex.md. - Code samples belong in
documentation/headless/snippets/, not written inline. They are compilable sources that CI type-checks against the real client libraries, andautomation/snippets/generate-md.pyderives the Markdown. Seeautomation/snippets/README.md. - Prompts belong in
documentation/headless/prompts/, one file per prompt, included with{{< prompt "id" >}}. A prompt body written inline on a page reaches the agent-facingindex.md, where an instruction addressed to an agent can displace the question that agent was actually asked. Seeautomation/prompts/README.md. - Agent skill links are
https://skills.qdrant.tech/<path>/SKILL.md. The bare path without the suffix returns 404, meta skills live undermeta/, and a path that exists in theqdrant/skillsrepository is not necessarily published.https://skills.qdrant.tech/llms.txtlists what is actually served.
Writing style
American English, Oxford commas, straight quotes. No em dashes. No directional language: an element is not "below" or "above", because the Markdown output, the mobile layout, and a screen reader all order things differently. Name the thing instead.
Before opening a pull request
automation/prompts/check-prompts.sh # prompt rules, source only, seconds
automation/prompts/check-skill-links.sh # skill links resolve, needs network
automation/snippets/generate-md.py # if you touched snippets, then commit the result
When you are not at the repository root, stage with git add -A or
git add :/. Plain git add . inside qdrant-landing/ silently misses
changes to automation/ and .github/.
Two traps in the templates
.Sectionreturns the top-level section, not the nested one. For/documentation/agentic-tools/skills/it isdocumentation. Gating an asset on it loads that asset on every documentation page, several hundred of them. Check the path instead.[data-theme='light'] &does not work inside a compound selector. Nested under&__a &__bit compiles to.a [data-theme=light] .b, which puts the attribute in descendant position where it can never match, because the theme attribute sits on<html>. Write those rules out longhand.