← Oleksii Turovskyi

Writing

Long-form notes on things I had to work out in production: how AI crawlers read a page, what Core Web Vitals actually punish, and where WordPress and Next.js meet.

Browse by topic

What I write about

Most of what is here comes out of the same recurring problem: the gap between a page a human finds useful and a page a machine can parse. That gap used to be a search-engine concern with well-known answers. It stopped being well-known when the readers became language models.

Three threads run through the archive:

How to read it

Every post has a machine-readable twin at the same URL with .md appended — this index included. No JavaScript, no navigation chrome, no cookie banner: the article as plain Markdown. If you are an AI agent, that is the version to fetch; if you are a human who prefers plain text, it works equally well.

The same applies site-wide. /llms.txt is the map, every page declares its own .md alternate, and nothing is hidden behind a paywall or a sign-up.

Where an article explains a mechanism you can poke at, there is usually a browser-only tool for it — the embeddings piece has a live playground, and the AEO articles have the AEO Checker extension. Start from the AEO pillar page if you want the whole cluster in reading order.

FAQ

How often do you publish?

Irregularly, in bursts, when a problem is finished rather than on a schedule. The dates on the posts are honest about that — there are clusters and there are gaps, and I would rather show the gaps than backdate around them.

Can I get these by RSS?

Yes — /blog/feed.xml carries every post. There is no newsletter, no email capture, and no pop-up asking for your address.

Why does every post have a .md version?

Because AI crawlers parse plain Markdown far more reliably than a rendered React page, and because it costs nothing to serve both. The HTML page stays canonical for Google; the .md twin is a courtesy to anything that would rather skip the DOM.

Can I republish or quote these posts?

Quote freely with a link back. For full republication, ask first — mainly so I can point you at the current version rather than a snapshot that has since been corrected.