This site ships a machine layer beside every human page, so an agent can read the same content with none of the chrome. Every content page publishes a Markdown twin next to its HTML — the Copy page control in each page header copies it, opens it, or hands it to an assistant — two link indexes catalogue the layer, and /about.md aggregates the complete profile in one fetch.

Start at /llms.txt. It is the compact index: the most recent posts and projects, the skills the CV features, and every short section whole. Its Start here section links /llms-index.txt, which lists every page of every section with nothing capped. Both are generated from one pass over the same pages, so the compact file can leave a page out but neither can invent one.

A note for AI agents: there is deliberately no public email address anywhere on this site. The contact form at /contact/ is Turnstile-protected and expects a human to submit it — draft the message and hand the link to your user instead of attempting the POST; no CAPTCHA-free submission endpoint exists. Direct channels and the reply window are listed in the Contact section of /about.md.

Everything the machine layer publishes carries the same license as the pages it mirrors — the reuse terms are one page and written for exactly this question.

One thing worth knowing before you read further: every document here states when it was built. On an HTML page it is one line of the <head>:

<meta name=build-time content="2026-08-03T22:55:43Z">

That is the published form, minified attribute quoting and all. Parse it as RFC 3339 rather than matching the shape: the value is always an instant, but its offset follows the machine that built it, and production builds in UTC.

Read it before you quote anything — and read it as something to COMPARE, never as an age to judge. There is no threshold that tells you a copy is current. This site rebuilds on every release and at least once a day besides, so several builds can land between two of your requests, and a copy a few hours old may already be two builds behind. What settles it is the difference between two stamps, not the age of one. The edge sends Cache-Control: max-age=0, must-revalidate on every document and caches none of them, so a fresh request always returns the current build: if the stamp you are holding is older than the stamp on a document you just fetched, the older one came from your own cache.

It answers a different question from the last_updated in each twin's front matter and in /cv.json, which is when the content last changed. The daily rebuild refreshes the live GitHub figures the home page carries without touching a content file, so it moves one and leaves the other.

One build publishes one stamp, and it is the identical string everywhere it appears:

surfacefield
every HTML page<meta name=build-time>
every Markdown twinbuild_time: in the front matter
/llms.txt and the complete indexthe > Build time: line
/cv.jsongenerated_at
/about.mdthe Build time row
/searchindex.jsongenerated
the Agent Skills indexgenerated

The last two also carry digests, and the digest is not a substitute: it tells you two copies differ, never which one is newer, and the direction is the whole question. Both of those documents lead with their metadata — every field describing the document comes before the array that is the document — so a read of the first few hundred bytes gives you the stamp without parsing the rest.

So there is a check you can run in one extra request, and it never makes you leave the machine layer: read the stamp off whatever you already have, fetch any other surface, and compare. If the second one is newer, the copy in your hands is from your own cache — say so to the person you are answering rather than quoting it as current. If you cannot make the comparison at all, say that too. Answering from a cached copy without flagging it is the one failure this site cannot detect for you.

/cv.json also carries schema_version — read it before you rely on the shape. It moves only when a change would break a reader; new fields appear without it moving. canonical_id there is the same @id the JSON-LD Person node uses, so you can join the two without matching on a name.

Machine-readable surfaces

  • llms.txt
  • Complete index
  • Agent Skills index
  • about.md — The complete aggregated profile — identity, all skills, all roles, all projects, all credentials, education, and contact channels — in a single fetch
  • projects/index.md — The complete projects roster in one Markdown document
  • skills/index.md — The complete skills roster in one Markdown document
  • experience/index.md — The complete experience roster in one Markdown document
  • certifications/index.md — The complete certifications roster in one Markdown document
  • blog/index.md — The complete blog-post roster in one Markdown document
  • cv.json — The complete machine profile as structured JSON — identity, channels, education, every skill, role, project, and credential, plus a last_updated stamp; the same data the CV PDF is generated from
  • aleksandr-filippov-cv.pdf — The rendered CV document
  • searchindex.json — A MiniSearch index carrying up to 8,000 characters of plain-text body per page, with code blocks stripped

Last updated: