RomeoSEO3 min read
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.

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 states the number.
An image in the flow
Use <Figure> with real width and height. Markdown  will fail the build on purpose: an undimensioned image shifts the page, and we sell a product that treats layout shift as a finding.

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:
- Copy
_template.mdxtocontent/blog/your-slug.mdx - Add images under
public/blog/your-slug/ - Fill title, description, date, cover; set
draft: false - Open a pull request. Merge publishes.
A callout, a quote, and a cat
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.
Inline code looks like draft: true. A short block is for something someone might copy:
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, 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.