core-seo
The core-seo plugin adds basic SEO meta tags to every published page that themes don't already cover by default. It's intentionally minimal — bigger SEO concerns (sitemaps, structured data, robots.txt) live in their own plugins.
What it does
On every published page, core-seo injects:
- A Twitter Card meta tag set, configured for
summary_large_image:<meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="<page title>"><meta name="twitter:description" content="<page description>">(when set)<meta name="twitter:image" content="<og image url>">(when the post has a hero or OG image)
- A
<meta name="generator" content="Flexweg CMS">hint identifying the site as built with Flexweg CMS
The plugin doesn't override the standard tags themes already emit:
<title>(from each theme's BaseLayout)<meta name="description">(same)<meta property="og:*">Open Graph tags (same — themes emitog:title,og:description,og:url,og:image,og:type)<link rel="canonical">(same)
It's purely additive.
How it hooks in
The plugin registers a single filter on page.head.extra:
api.addFilter<string>("page.head.extra", (current, ...rest) => {
const props = rest[0] as BaseLayoutProps | undefined;
if (!props) return current;
return [current, generatorMetaTag(), twitterCardTags(props)]
.filter(Boolean)
.join("\n");
});
The filter receives the accumulated extra-head HTML and the BaseLayoutProps of the current page (page title, description, hero image URL). It appends its tags and returns the result.
The filter chain runs at publish time inside core/render.tsx — replacing the <meta name="x-cms-head-extra" /> sentinel in the theme's BaseLayout with the filter result.
Settings
No settings page. The plugin is intentionally zero-config. Per-post SEO overrides (title, description, OG image) live on the post itself in the editor's Document sidebar — they propagate to both the theme's standard tags and the core-seo Twitter Card tags automatically.
When to disable
- Your theme already emits Twitter Card tags itself (rare for built-in themes; more likely with custom externals)
- You want to handle social meta entirely through a different plugin (e.g. a future Yoast-style SEO plugin)
- You don't want the
<meta name="generator">revealing the underlying CMS
Disabling core-seo has no impact on the rest of the publish pipeline. Page titles, descriptions, Open Graph tags survive because they come from the theme.
Toggle
Plugins → Plugins tab → core-seo card → Enable / Disable button.
When changes apply
The plugin's filter runs at publish time. So:
- Newly published pages include the tags immediately
- Already-published pages keep their existing HTML — disabling doesn't strip the tags from already-rendered files
To apply changes retroactively (after enabling or disabling):
- Themes → Regenerate site → All HTML pages — re-renders every published page through the publisher with the current plugin set
Internal details
- Source:
src/plugins/core-seo/ - Bundle size: ~2 KB compiled
- External in production builds: yes (loaded via the runtime registry like third-party plugins)
- Hooks used:
page.head.extrafilter only - Translations: none (no UI)
Continue
- Plugins overview
- flexweg-sitemaps — for sitemaps + robots.txt
- flexweg-rss — for RSS feeds
- Hooks reference — the filter system in detail