# Writing

> Notes on full-stack development — WordPress, Next.js, Core Web Vitals, and how AI search decides which pages it is willing to cite.

**Canonical:** https://alexturik.com/blog

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.

## Posts

### Skip the AI Visibility Checker: Audit Your Site by Hand

- **URL:** https://alexturik.com/blog/how-to-audit-ai-visibility
- **Markdown:** https://alexturik.com/blog/how-to-audit-ai-visibility.md
- **Published:** 2026-08-09
- **Tags:** aeo, ai-search, llms-txt, structured-data, audit

Run the same eight checks a paid AI visibility checker runs, for free: llms.txt, robots.txt, JSON-LD, and real 2026 baselines to compare your site against.

### GEO vs SEO vs AEO — What Actually Changes in Your Workflow

- **URL:** https://alexturik.com/blog/geo-vs-seo-vs-aeo
- **Markdown:** https://alexturik.com/blog/geo-vs-seo-vs-aeo.md
- **Published:** 2026-08-09
- **Tags:** aeo, geo, ai-search, seo, structured-data

I scanned 93 pages ranking for AEO and GEO queries to see whether the people explaining the difference follow their own advice. Only 25.8% did.

### Embeddings: How AI Search Turns Your Page Into 384 Numbers

- **URL:** https://alexturik.com/blog/embeddings-how-ai-search-turns-your-page-into-numbers
- **Markdown:** https://alexturik.com/blog/embeddings-how-ai-search-turns-your-page-into-numbers.md
- **Published:** 2026-07-27 · **Updated:** 2026-08-09
- **Tags:** embeddings, ai-search, semantic-search, aeo, web-platform

AI search doesn't match keywords - it compares vectors. Turn your text into an embedding, run cosine similarity live, and watch stuffing win the wrong race.

### The Temporal API: Fixing 30 Years of JavaScript Dates

- **URL:** https://alexturik.com/blog/the-temporal-api-fixing-javascript-dates
- **Markdown:** https://alexturik.com/blog/the-temporal-api-fixing-javascript-dates.md
- **Published:** 2026-07-01 · **Updated:** 2026-08-09
- **Tags:** javascript, temporal, es2026, dates, web-platform

JavaScript's Date has shipped the same bugs since 1995 — mutation, zero-based months, no real time zones. Temporal fixes them, run every example live.

### How I Added llms.txt to My Next.js Blog in 15 Minutes

- **URL:** https://alexturik.com/blog/how-i-added-llms-txt-to-my-nextjs-blog-in-15-minutes
- **Markdown:** https://alexturik.com/blog/how-i-added-llms-txt-to-my-nextjs-blog-in-15-minutes.md
- **Published:** 2026-05-09 · **Updated:** 2026-08-09
- **Tags:** llms-txt, aeo, nextjs, ai-search, web-platform

How llms.txt works, why 52.7% of pages ranking for AEO and GEO queries now serve one, and two ways to ship it on a Next.js blog in 15 minutes.

### The 3-Word Tag That Hides Your Best Pages from AI

- **URL:** https://alexturik.com/blog/the-3-word-tag-that-hides-your-best-pages-from-ai
- **Markdown:** https://alexturik.com/blog/the-3-word-tag-that-hides-your-best-pages-from-ai.md
- **Published:** 2026-05-08 · **Updated:** 2026-08-09
- **Tags:** aeo, ai, robots, html, nextjs

Three words in `<head>` can hide your best article from ChatGPT, Claude, and Perplexity — even if Google still shows it. The silent AEO killer.

### Recency and Authority — Two Fields AI Uses to Trust You

- **URL:** https://alexturik.com/blog/recency-and-authority-two-schema-fields-that-decide-ai-trust
- **Markdown:** https://alexturik.com/blog/recency-and-authority-two-schema-fields-that-decide-ai-trust.md
- **Published:** 2026-05-07 · **Updated:** 2026-08-09
- **Tags:** aeo, ai, structured-data, jsonld, nextjs

Before quoting your article, AI runs two checks — is it fresh, and who wrote it. Both ride on machine-readable signals. Here's the canonical setup.

### How to Help AI Understand Your Content with JSON-LD

- **URL:** https://alexturik.com/blog/help-ai-understand-your-content-with-json-ld
- **Markdown:** https://alexturik.com/blog/help-ai-understand-your-content-with-json-ld.md
- **Published:** 2026-05-06 · **Updated:** 2026-08-09
- **Tags:** aeo, ai, structured-data, jsonld, nextjs

LLMs ground answers in structured data. With schema.org markup, the model sees a typed object — author, date, headline. Here's the canonical setup.

### The Invisible Tags Shaping Your AI Citations

- **URL:** https://alexturik.com/blog/the-invisible-tags-shaping-your-ai-citations
- **Markdown:** https://alexturik.com/blog/the-invisible-tags-shaping-your-ai-citations.md
- **Published:** 2026-05-05 · **Updated:** 2026-08-09
- **Tags:** aeo, seo, metadata, opengraph, nextjs

title, meta description, og:image, canonical — four tags decide if ChatGPT and Perplexity render your brand on the citation card. The bundle.

### Semantic HTML — Skipping Headings Breaks AI Optimization

- **URL:** https://alexturik.com/blog/semantic-html-for-machines-heading-hierarchy
- **Markdown:** https://alexturik.com/blog/semantic-html-for-machines-heading-hierarchy.md
- **Published:** 2026-05-04 · **Updated:** 2026-08-09
- **Tags:** aeo, ai, html, accessibility

AI crawlers parse your heading outline before anything else. Skip an H3 and you create a phantom node — here's how to keep structure clean for LLMs.

### The JavaScript Trap — Why AI Bots See Empty Pages

- **URL:** https://alexturik.com/blog/the-javascript-trap-why-ai-bots-see-empty-pages
- **Markdown:** https://alexturik.com/blog/the-javascript-trap-why-ai-bots-see-empty-pages.md
- **Published:** 2026-05-03 · **Updated:** 2026-08-09
- **Tags:** aeo, ai, ssr, nextjs, performance

AI crawlers don't run JavaScript. If your raw HTML is a hollow `<div id="root"></div>`, you're invisible to ChatGPT, Claude, and Perplexity.

### Why Your Site Doesn't Show Up in ChatGPT (or Perplexity)

- **URL:** https://alexturik.com/blog/why-your-site-doesnt-show-in-chatgpt-and-perplexity
- **Markdown:** https://alexturik.com/blog/why-your-site-doesnt-show-in-chatgpt-and-perplexity.md
- **Published:** 2026-05-02 · **Updated:** 2026-08-09
- **Tags:** aeo, seo, robots, ai

Three robots.txt strategies for AI crawlers, and the two configuration mistakes that quietly cut you out of ChatGPT, Claude, and Perplexity answers.


## 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 machines read pages** — `llms.txt`, JSON-LD, semantic heading
  structure, embeddings, the meta tags that quietly exclude you from AI
  answers. Start with [Why your site doesn't show in ChatGPT and
  Perplexity](/blog/why-your-site-doesnt-show-in-chatgpt-and-perplexity).
- **Measuring it rather than guessing** — [How to audit AI
  visibility](/blog/how-to-audit-ai-visibility) walks the audit this site runs
  on itself, with the [AEO Checker](/extensions/aeo-checker) extension doing
  the per-page part.
- **The platform underneath** — Next.js, WordPress, Core Web Vitals, and the
  occasional language feature worth the migration, like [the Temporal
  API](/blog/the-temporal-api-fixing-javascript-dates).

## How to read it

Every post has a machine-readable twin at the same URL with `.md` appended —
[this index included](/blog.md). 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`](/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](/tools) for it — the embeddings piece has a live
[playground](/tools/embedding-playground), and the AEO articles have the
[AEO Checker](/extensions/aeo-checker) extension. Start from the
[AEO pillar page](/aeo) 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](/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.
