> ## Content Index
> Fetch the complete content index at: https://journal.aftertype.studio/llms.txt
> Use this file to discover other available public pages before exploring further.

# Structured data and llms.txt in a Ghost theme
- URL: https://journal.aftertype.studio/structured-data-and-llms-txt-in-a-ghost-theme/
- Published: 2026-11-05T10:00:27.000Z
- Updated: 2026-11-05T10:00:27.000Z
- Author: Richard Lemon
- Tags: Ghost, Northline

Ghost already writes most of the structured data a publication needs. A good theme adds only what Ghost leaves out, mainly breadcrumbs, and takes care not to break what Ghost provides. llms.txt is a separate, site-level file: cheap to publish, easy to overrate.

This is what we learned building three Ghost themes and the shop that sells them, including the mistakes our own audits caught. If you are looking for a Ghost theme with SEO built in, this is also what to check before you buy one.

## What Ghost already gives you

Every Ghost theme calls `{{ghost_head}}` in its `default.hbs`. That one helper outputs the canonical URL, Open Graph and Twitter tags, and a JSON-LD block per page type: an Article on posts (with the author as a Person), a WebSite on the homepage and a Series on tag archives. Title, dates, author, feature image and publisher logo all come from what you enter in Ghost Admin.

The practical consequence: most of your structured data is editorial, not technical. Ghost uses the excerpt as the description. Leave it empty and Ghost falls back to the first text of the post. On our podcast theme, Sounding, that turned out to be the audio player's own text: an episode without an excerpt went out with "0:00 /0:23 1x" as its description. No theme can fix that. Writing the excerpt can.

So the first rule for a theme is: don't fight `{{ghost_head}}`. Don't remove it, don't output a second Article next to Ghost's, and don't hard-code values Ghost already knows.

## What a theme can add

The clearest gap is breadcrumbs. Ghost doesn't output a BreadcrumbList, and a magazine with sections and tags benefits from one. Northline adds it in a single partial, `partials/structured-data.hbs`. Our rule across all three themes is the same: JSON-LD only as a supplement to what `{{ghost_head}}` already delivers, and no custom helpers.

That partial is also where we made our first real mistake. Reading the live HTML of the Northline demo before release, we found the breadcrumb `item` for the current post serialized as `{"string": "..."}` instead of a URL. The `{{json}}` helper had received the SafeString object that `{{url}}` returns, not the plain string. The page looked fine; the breadcrumb pointed nowhere. After the fix, a post URL passed the test.

Two lessons from that. Test the rendered HTML of a real post, not your template. And check every value that passes through a Handlebars helper before it lands in JSON.

The shop taught us the opposite lesson. An audit reported that our theme pages had no Schema.org at all. They did: Organization, WebSite and Product were rendering live. The scraping tools had stripped the script tags before reading the page. The real gap was smaller and only visible in a validator: our Product had no `image`. Later we also merged two nodes per theme into one. A Product plus a separate SoftwareApplication, each with its own Offer, reads as two products, so each theme page now has one Product with `additionalType` set to SoftwareApplication.

## What llms.txt is, and what it isn't

llms.txt is a proposed convention: a Markdown file at the root of your site that summarizes what the site is and links to the pages that matter, written for language models rather than browsers. An optional llms-full.txt carries the full text. It is not a standard that search engines or AI companies have committed to, and it does nothing for your Google rankings.

It lives at the site level, not in the theme. On our journal we didn't build any of it. Since [July 2026](https://ghost.org/changelog/geo/?ref=journal.aftertype.studio) Ghost serves /llms.txt, /llms-full.txt and a Markdown version of every public post and page itself: append .md to the URL. On existing sites it's off by default; you turn it on under Settings, Meta data. Members-only posts appear with their title and excerpt only. Those excerpts are the summaries a model reads, so the same editorial rule applies as for structured data. The shop's llms.txt names all three themes with their launch dates and links to the theme pages for prices. We left the prices out on purpose: a price changes, and a stale summary is worse than none.

Then the honest part. [I checked two weeks of Nginx logs](https://richardlemon.com/who-reads-my-llms-txt-results/?ref=journal.aftertype.studio) on my personal Ghost blog. llms.txt and llms-full.txt were requested 31 times. Two of those requests came from an AI agent, and none from GPTBot, ClaudeBot, PerplexityBot or Googlebot. One small site and one short window prove little. Still, we publish llms.txt because it costs almost nothing, not because we expect crawlers to read it.

## How to check your own site

1. Open the page source of a real post (not reader mode, not a scraper) and search for `application/ld+json`. You should see Ghost's block, plus whatever your theme adds.
2. Paste the post URL into Google's [Rich Results Test](https://search.google.com/test/rich-results?ref=journal.aftertype.studio) and into the [Schema Markup Validator](https://validator.schema.org/?ref=journal.aftertype.studio). The first tells you what Google can use, the second whether the markup is valid at all.
3. Look for values that are objects where you expect text or a URL. That is how helper bugs show up.
4. Read the description Ghost generated for a post without an excerpt. If it reads badly, write the excerpt.
5. For llms.txt: request it yourself, then check your server logs to see who else does.

## FAQ

**Does a Ghost theme need its own structured data?** Mostly not. Ghost's `{{ghost_head}}` covers posts, the homepage and tag archives. A theme should add only what is missing, such as breadcrumbs.

**Can a theme make my SEO worse?** Yes: by removing `{{ghost_head}}`, by duplicating Ghost's Article, or by outputting broken values. Check the rendered HTML of a real post.

**Does llms.txt help with ranking?** No. It is a summary for language models, and in our logs the major AI crawlers didn't fetch it. Publish it if it's cheap for you, and keep it accurate.

**Where do I put llms.txt on Ghost?** You may not have to. Since July 2026 Ghost can generate it, plus llms-full.txt and .md versions of posts. On an existing site, turn it on under Settings, Meta data, before you build your own.