You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Split the single blog into three @docusaurus/plugin-content-blog instances so each section has its own list page, sidebar and feed. A tag-based split was ruled out because the blog sidebar is built per plugin instance and cannot be filtered by tag.
Sections
Section
Instance id
Route
Content dir
Product announcements
product
/blog/product
blog/product
Provider announcements
providers
/blog/providers
blog/providers
Tutorials
tutorials
/blog/tutorials
blog/tutorials
Top-level /tutorials is not available: src/pages/tutorials.js already redirects it to /docs/tutorials.
Prerequisite (done before this issue is executed)
Each of the 105 existing posts gets exactly one marker tag in its tags front matter: product-announcement, provider-announcement or tutorial. The existing provider tag is not a reliable marker. Posts with zero or more than one marker tag should fail the move script.
Tasks
Move each post into its section dir based on the marker tag, then drop the marker tag (the instance conveys the type). Slugs stay unchanged.
Set blog: false in the classic preset and add three blog plugin instances, each with blogSidebarCount: 'ALL', its own blogSidebarTitle, blogTitle, blogDescription and feedOptions, and the existing postsPerPage, showReadingTime and editUrl settings.
Share blog/authors.yml across the three instances (authorsMapPath) rather than copying it.
Add a /blog landing page linking to the three sections with the latest posts from each.
Generate 301 redirects in netlify.toml for every post: /blog/<slug> -> /blog/<section>/<slug>, plus the .md companion paths. Generate from front matter slugs, not filenames.
Redirect old /blog/tags/* and /blog/page/* routes to /blog.
Update sitemap ignorePatterns to cover /blog/*/tags/** and /blog/*/page/**.
Update navbar ("More" dropdown) and footer links to expose the three sections.
Fix internal links to old post URLs in docs, ai-content and blog (about 11 relative, 7 absolute stackql.io/blog/...). onBrokenLinks: 'throw' catches the relative ones; the absolute ones need a grep.
@stackql/docusaurus-plugin-structured-data: src/index.js assumes /blog/<slug> (breadcrumb logic and isSkippedRoute for /blog/tags, /blog/page). Update for /blog/<section>/<slug>, release, and bump the version here.
@stackql/docusaurus-plugin-aeo: replace the docusaurus-plugin-content-blog@default key in llmsTxt.instanceSections with the three new instance ids, and verify .md companions and the Ask AI button work for non-default blog instances.
Update CLAUDE.md to describe the new blog structure.
Trigger an Algolia recrawl after deploy.
Open questions
Old feed URLs (/blog/rss.xml, /blog/atom.xml, /blog/feed.json): redirect to the product announcements feed, or generate a combined feed at the old paths?
Naming: "Tutorials" in the nav currently means the docs tutorials at /docs/tutorials. Decide how the blog tutorials section is labelled and whether the two cross-link.
Acceptance criteria
Each section list page and post page shows a sidebar containing only that section's posts.
Every pre-existing post URL returns a 301 to its new URL.
yarn build passes with onBrokenLinks: 'throw'.
Each section has its own RSS/Atom feed.
A post from each section emits valid Article and BreadcrumbList JSON-LD.
llms.txt lists the three blog sections.
Sitemap excludes tag and pagination routes for all three sections.
Summary
Split the single blog into three
@docusaurus/plugin-content-bloginstances so each section has its own list page, sidebar and feed. A tag-based split was ruled out because the blog sidebar is built per plugin instance and cannot be filtered by tag.Sections
product/blog/productblog/productproviders/blog/providersblog/providerstutorials/blog/tutorialsblog/tutorialsTop-level
/tutorialsis not available:src/pages/tutorials.jsalready redirects it to/docs/tutorials.Prerequisite (done before this issue is executed)
Each of the 105 existing posts gets exactly one marker tag in its
tagsfront matter:product-announcement,provider-announcementortutorial. The existingprovidertag is not a reliable marker. Posts with zero or more than one marker tag should fail the move script.Tasks
blog: falsein the classic preset and add three blog plugin instances, each withblogSidebarCount: 'ALL', its ownblogSidebarTitle,blogTitle,blogDescriptionandfeedOptions, and the existingpostsPerPage,showReadingTimeandeditUrlsettings.blog/authors.ymlacross the three instances (authorsMapPath) rather than copying it./bloglanding page linking to the three sections with the latest posts from each.netlify.tomlfor every post:/blog/<slug>->/blog/<section>/<slug>, plus the.mdcompanion paths. Generate from front matter slugs, not filenames./blog/tags/*and/blog/page/*routes to/blog.ignorePatternsto cover/blog/*/tags/**and/blog/*/page/**.docs,ai-contentandblog(about 11 relative, 7 absolutestackql.io/blog/...).onBrokenLinks: 'throw'catches the relative ones; the absolute ones need a grep.@stackql/docusaurus-plugin-structured-data:src/index.jsassumes/blog/<slug>(breadcrumb logic andisSkippedRoutefor/blog/tags,/blog/page). Update for/blog/<section>/<slug>, release, and bump the version here.@stackql/docusaurus-plugin-aeo: replace thedocusaurus-plugin-content-blog@defaultkey inllmsTxt.instanceSectionswith the three new instance ids, and verify.mdcompanions and the Ask AI button work for non-default blog instances.CLAUDE.mdto describe the new blog structure.Open questions
/blog/rss.xml,/blog/atom.xml,/blog/feed.json): redirect to the product announcements feed, or generate a combined feed at the old paths?/docs/tutorials. Decide how the blog tutorials section is labelled and whether the two cross-link.Acceptance criteria
yarn buildpasses withonBrokenLinks: 'throw'.ArticleandBreadcrumbListJSON-LD.llms.txtlists the three blog sections.