Skip to content

Add blog categories taxonomy and consolidate tags#19661

Open
jeffmerrick wants to merge 2 commits into
masterfrom
jeffmerrick/blog-categories-tags
Open

Add blog categories taxonomy and consolidate tags#19661
jeffmerrick wants to merge 2 commits into
masterfrom
jeffmerrick/blog-categories-tags

Conversation

@jeffmerrick

@jeffmerrick jeffmerrick commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Human Jeff here - bringing categories into the blog and doing some tag cleanup. Totally open for different categories or changes to the names.

This is just a background change, the categories aren't displayed anywhere yet - that will happen in a larger blog UI revamp.

Resolves: #19030


What & why

Introduces a closed, lint-enforced categories axis for blog posts (the kind of post) alongside the existing curated-but-open tags axis and the optional series axis. This gives blog content a consistent, queryable taxonomy and prevents the tag sprawl/near-duplicate drift we've accumulated over time.

Changes

New source-of-truth data files

  • data/blog_categories.yaml — the 7 allowed category ids (agentic-infrastructure, product-launches, engineering, tutorials, best-practices, security-governance, community), with descriptions and selection hints.
  • data/blog_tags.yaml — the deduplicated canonical tag vocabulary.

Enforcement

  • scripts/lint/lint-markdown.jsmake lint now fails any content/blog/*/index.md whose categories is missing, empty, invalid, or lists more than two values. Section/list/tag _index.md pages are excluded.

Content backfill

  • Added a valid category to all 788 blog posts.
  • Normalized legacy tags to lowercase-hyphenated canonical forms (k8skubernetes, iacinfrastructure-as-code, pulumi-servicepulumi-cloud, .netdotnet, etc.).
  • Added the Pulumi Copilot series to data/blog_series.yml (6 member posts).

Docs

  • Documented the rules in AGENTS.md, BLOGGING.md, the new-blog-post command, and the blog-post archetype.

Verification

  • node ./scripts/lint/lint-markdown.js content/blog → 788 files parsed, 0 errors.
  • Programmatic checks confirm: all posts have a valid category, none exceed two, no placeholder values leaked, and no flagged near-duplicate tags remain.

🤖 Generated with Claude Code

Introduce a closed, lint-enforced `categories` axis for blog posts
(the "kind of post") alongside the existing curated-but-open `tags`
axis and optional `series` axis.

- data/blog_categories.yaml: new single source of truth for the 7
  allowed category ids; data/blog_tags.yaml: deduplicated canonical
  tag vocabulary.
- scripts/lint/lint-markdown.js: enforce exactly-one (max two) valid
  category on every content/blog/*/index.md.
- Backfill categories on all 788 posts and normalize legacy tags to
  the lowercase-hyphenated canonical forms (k8s->kubernetes,
  iac->infrastructure-as-code, pulumi-service->pulumi-cloud, etc.).
- Add the Pulumi Copilot series to data/blog_series.yml.
- Document the rules in AGENTS.md, BLOGGING.md, the new-blog-post
  command, and the blog-post archetype.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Social Media Review

content/blog/cloudflare-first-networking-with-pulumi/index.md

X — PASS

(LinkedIn and Bluesky already posted.)


content/blog/deploy-a-hermes-agent-with-pulumi/index.md

X — PASS

(LinkedIn and Bluesky already posted.)


content/blog/end-to-end-databricks-with-pulumi/index.md

X — PASS

(LinkedIn and Bluesky already posted.)


content/blog/neo-code-reviews/index.md

X — PASS

LinkedIn — PASS

Bluesky — PASS


Suggestions (advisory)

These are stylistic notes — they don't block the post.

cloudflare — X

  • Missing pointer — ends on a declarative statement ("can all live in a repeatable Pulumi baseline"); no line signalling there's more to read in the article

deploy-a-hermes-agent — X

  • No suggestions

end-to-end-databricks — X

  • Missing pointer — "Put the governed baseline in Pulumi instead." is an imperative directed at the reader, not a signal to read the article; add a "here's how" line

neo-code-reviews — X

  • Missing pointer — "We built Neo code reviews to bridge the gap." ends on a product announcement; no line directing the reader into the article
  • "bridge the gap" is vague — name what the gap is or what the reader will find

neo-code-reviews — LinkedIn

  • Third paragraph explains the mechanism in full ("evaluate changes not just in terms of the infra code alone, but also in the context of existing deployed infrastructure") — closes the curiosity gap before the reader clicks; trim to leave the mechanism for the article

neo-code-reviews — Bluesky

  • Same copy as X — missing pointer; "We built Neo code reviews to bridge the gap." ends on an announcement with no signal to read more

Updated for commit a1acd9631dffe9432b9dd0d04227f229e9bf5ba4 (short: a1acd96) at 2026-06-24 13:12 UTC.

@pulumi-bot

pulumi-bot commented Jun 15, 2026

Copy link
Copy Markdown
Collaborator

@jeffmerrick jeffmerrick requested a review from cnunciato June 24, 2026 13:06
@jeffmerrick jeffmerrick marked this pull request as ready for review June 24, 2026 13:07
Resolve conflicts: keep both new AGENTS.md sections (blog taxonomy +
dark mode) and both new front-matter keys on esc-sync-with-iac
(categories + canonical_url). Backfill categories on the two blog
posts added on master (deploy-a-hermes-agent-with-pulumi,
neo-code-reviews) so they satisfy the new lint rule.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Blog design improvements: update and clean up taxonomy

2 participants