cms · editorial · docs

CMS Feature Guide — every block, every role, every lever (US)

A guided tour of the Metaborong CMS — explained for US-based editors. Every block type, every semantic role, every SEO/AEO/GEO lever.

Metaborong Editorial

Welcome. This post is a guided tour of the Metaborong CMS — every block type, every semantic role, and every SEO/AEO/GEO lever the editor exposes. Open the same post in the editor (admin → Posts → CMS Feature Guide) to see how each block was authored.

TL;DR — pick block types from the slash menu (/), set roles from the right inspector, write naturally. Headings drive outline. Roles drive AEO/GEO. Variants drive geo personalization. Save auto-runs every 2s; Publish makes it live.

Heading levels and why they matter

The post title is the page H1 — always, automatically, not editable as a block. The first heading block you insert is therefore H2. Levels go H2 → H6 (no H1, no H7+).

Heading hierarchy is non-decreasing by more than one. H2 → H3 → H4 is fine. H2 → H4 skips H3 and confuses search engines, screen readers, and LLM summarisers. The editor warns when it spots a skip.

Anchors and jump links

Every heading can carry an anchor — a URL fragment that lets readers (and search engines) jump straight to that section. This block lives at /blog/cms-feature-guide#anchors. The editor auto-derives the anchor from the heading text; override it in the inspector when you want a custom fragment.

Semantic roles: how the CMS feeds AEO and GEO

A role tags a block's intent so the renderer can shape SEO/AEO/GEO outputs around it. You set the role from the block inspector (right rail). Roles are optional — leave them empty for ordinary body copy.

  • intro — opening paragraph; first ~120 chars become Article.description when no excerpt is set
  • tldr — short summary; surfaced to /llms.txt for LLM citation
  • definition — direct-answer block; wrapped for featured-snippet eligibility
  • step — sequential step; 3+ step blocks emit HowTo JSON-LD
  • evidence — source citation; signals trust for generative engines
  • cta — call-to-action; excluded from AI summaries

Three of the blocks in this very post carry roles — scroll up: the opening paragraph is intro, the second is tldr, and the heading-hierarchy paragraph is definition. Watch how those show up in the page source's JSON-LD when this is published.

Example: publishing your first post (HowTo schema)

The four paragraphs below carry role=step. The renderer detects 3+ steps and emits HowTo JSON-LD — Google's rich result for instructional content.

Click "New post" on the /admin dashboard. The CMS creates a draft and redirects you to the editor.

Fill in the title, slug, excerpt, tags, and author name. The (i) buttons next to each field explain what each one does and why it matters.

Write your content blocks. Type / to open the slash menu and pick a block type. Set roles in the right inspector. Auto-save runs every 2 seconds.

Click Publish. The post is live at /blog/<slug> within seconds, no redeploy. The slug locks after publish to preserve backlinks.

Block types — every flavour

Lists

Unordered lists (•) for collections — order doesn't matter:

  • DeFi
  • Custom AI agents
  • SaaS products
  • Smart-contract audits

Ordered lists (1, 2, 3) for sequences — order matters:

  1. Discovery call
  2. Design sprint
  3. Build phase
  4. Audit + launch

Quotes

The web is more a social creation than a technical one.

- Tim Berners-Lee

Code blocks

Inline code uses the Language hint as a CSS class. Full syntax highlighting is on the v2.1 roadmap.

import { db } from '@/db/client'
const posts = db.collection('posts')
const doc = await posts.findOne({ _id: id })

Callouts: tip, warning, note

FAQ pairs (FAQPage JSON-LD)

FAQ blocks aggregate into a FAQPage JSON-LD on the rendered page — Google's rich-result format for question-and-answer content. The Q field becomes the visible question heading; the A field becomes the answer paragraph.

How often does the public post page re-render?

Every 60 seconds via Next.js revalidation, plus instantly when an admin clicks Publish or Unpublish — both actions call revalidatePath for /blog and /blog/[slug].

How do I create a geo variant?

Click the US or EU tab at the top of the editor. Title, excerpt, and meta fields become per-region overrides. Per-block text and alt overrides live in the inspector's variant panel. Empty fields fall back to Base.

What is the AI Readiness scan?

Click "Check AI readiness" in the action bar. The CMS sends the live URL to VerseOdin (an external MCP server) which scores the page across robots.txt, sitemap, llms.txt, heading structure, readability, meta tags, semantic HTML, and accessibility. Scores are advisory — they don't block publish.

Images

Image blocks are not included in this demo because the post is seeded directly into Mongo without going through the upload flow. To insert an image in your own post: type / in the editor to open the slash menu, pick "image", and choose from the library (or upload new). Alt text is required by the schema — save fails without it.

Geo variants

This post has both a US and an EU variant — open it in the editor and click the tabs to see each region's overrides. The variants overlay title, excerpt, meta fields, and the per-block text from the inspector's variant panel. The slug, tags, structure, and canonical URL are shared.

AI Readiness scoring

The "Check AI readiness" button in the action bar (only visible after publish) sends the live post URL to VerseOdin's MCP server. The drawer that opens shows an overall score (0–100), a band (strong/adequate/weak), and per-check breakdowns — robots.txt presence, sitemap, llms.txt, heading structure, readability, meta tags, semantic HTML, accessibility. Cached for 1 hour against content hash so re-clicking unchanged content costs nothing. Rate-limited to 30 scans per admin per hour.

VerseOdin docs: https://verseodin.com — see lib/ai-readiness/client.ts for the JSON-RPC envelope and lib/blog-schema.ts for the score response shape.

Saving and publishing

The editor auto-saves every 2 seconds while you type. The Save button is a manual override — useful when you want a hard checkpoint or when validation needs to re-run server-side. Publish flips status to "published" and bumps published_at; it also calls revalidatePath so /blog, /sitemap.xml, /llms.txt, and /blog/rss.xml refresh inside a second.

Ready to write?

Head back to /admin and click "New post". The block editor is on the left, live preview on the right, slash menu opens with /, and every field has an (i) tooltip when you need it.