Skip to content

Split blog into product announcements, provider announcements, and tutorials #288

Description

@jeffreyaven

Summary

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

  1. 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?
  2. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions