# Anatomy of a blog post

A fixture showing every block a RomeoSEO post can use: cover image, body copy, figures, a comparison table, lists, a callout, code, and a word from Romeo.

- Published: 2026-08-13
- Author: RomeoSEO
- Canonical: https://romeoseo.com/blog/anatomy-of-a-blog-post

---

This page is the kit, not an argument. Every block a RomeoSEO post can use is on it, named as it appears, so the next article is a copy with the fixture pieces pulled out.

The cover above is frontmatter. The title, date, author and reading time are also frontmatter. Everything from here down is the MDX body.

## Body copy

Write in US English. Keep the product claims in the prose and the jokes in a bubble. The company is unserious; the product is serious. That split is the whole voice.

A post should still work if you delete Romeo's line. If deleting it loses information, it was never a Romeo line. It was product copy wearing a costume.

Internal links are ordinary Markdown. They should say where they go, the way [the landing page](/) explains the product and [pricing](/#pricing) states the number.

## An image in the flow

Use `<Figure>` with real width and height. Markdown `![alt](src)` will fail the build on purpose: an undimensioned image shifts the page, and we sell a product that treats layout shift as a finding.

<Figure
  src="/screenshots/site-audit.webp"
  alt="RomeoSEO site audit showing 451 pages improved and 412 declined, with five proposed tasks by priority"
  caption="A product screenshot, framed. Caption optional. Alt text required."
  width="2150"
  height="1786"
/>

No stock photography. No generated mascot art. Reuse a screenshot, a Romeo pose, or a file you added under `public/blog/your-slug/`.

## A comparison table

GFM tables. First column is the axis; the rest are the things being compared. Keep cells short enough to read on a phone, where the table scrolls sideways rather than shrinking into mush.

| | Rank trackers | Article farms | RomeoSEO |
|---|---|---|---|
| Job | Measure the SERP | Fill a calendar | Ship the fix |
| Output | A report | A draft you still have to place | A pull request you approve |
| Existing pages | Tracked | Ignored | The default target |
| New pages | Out of scope | The whole product | Only when research says a page cannot absorb the query |
| Publishes itself | No | Often | Never |

That table is a fixture, not a teardown. We are not an Ahrefs replacement and we are not a crawler. We are the layer that turns the data you already have into a change on a branch.

## Lists

Some things come in lists. Use bullets when the order does not matter:

- Cover image, from frontmatter, with alt text and pixel dimensions
- Body copy at a readable measure
- Inline figures, comparison tables, callouts
- One Romeo line, visually separated, optional

Use numbers when the order is the point:

1. Copy `_template.mdx` to `content/blog/your-slug.mdx`
2. Add images under `public/blog/your-slug/`
3. Fill title, description, date, cover; set `draft: false`
4. Open a pull request. Merge publishes.

## A callout, a quote, and a cat

> **Constraint**
>
> Drafts are omitted from production: the index, the sitemap, and `llms.txt`. They render in local development so you can read them before the PR.

A blockquote is for a sentence worth pulling, not for decorating a paragraph you already wrote:

> RomeoSEO reviews the rankings and content you already have, decides what is actually worth fixing, and ships the fix as a pull request you approve.

> Romeo says: I do not write these. I merely refuse to publish them.

Inline code looks like `draft: true`. A short block is for something someone might copy:

```yaml
title: Anatomy of a blog post
publishedAt: 2026-08-13
draft: false
```

## How a new post actually ships

There is no CMS login. The file is the CMS. An agent with access to this repo adds one MDX file, opens a PR, and the next production build puts the post on [the blog](/blog), in `/sitemap.xml`, and in `/llms.txt`. Crawlers that prefer Markdown can fetch `/blog/anatomy-of-a-blog-post/raw`.

That is the same loop the product sells. The fixture exists so the next post does not have to invent the blocks.

Join the waitlist: https://romeoseo.com
