Skip to content

Commit 5e80042

Browse files
jeffmerrickclaudecnunciato
authored
Releases: expanded changelog view, authors, RSS, tiers array, and JSON body (#20233)
* Releases changelog: expanded view, authors, RSS, and tiers array (#20221) Add three features to /releases and formalize the changelog tier field: - Expanded view: /releases/changelog now renders the full changelog inline, as a List/Expanded toggle (icon button group) that navigates between /releases (compact rows + modal) and /releases/changelog. Both share a new releases/changelog-index.html partial; no JS/persisted state. - Authors: changelog entries take an optional `authors:` array, rendered as an "— Name, Name" attribution linked to author pages. Attributed all 14 entries from the linked blog posts and #product-updates. Added team entries + photos for Daniel Perlovsky and Jeff Merrick. - RSS: surface the existing /releases/rss.xml feed with a visible button. - Tiers: replace the singular `tier:` scalar with a `tiers:` array restricted to the four pricing tiers (Free/Team/Enterprise/Business Critical), enforced by checkChangelogTiers in lint-markdown.js. Authors list every applicable tier (lowest + all above). Aligned the release-page card partials too. Also adds a reusable .btn-group utility and rounds video/audio corners (rounded-lg) so embedded changelog media matches the card styling. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Add rendered changelog body (absolute URLs) to the releases JSON feed Each entry in /releases/index.json now carries an optional `body` field with the entry's rendered HTML content — the minimal fragment (no page chrome), present only when the page has a body (changelog items always do). Root-relative links and assets are rewritten to absolute https://www.pulumi.com/... URLs so off-domain consumers (e.g. an external app) resolve them; already-absolute and protocol-relative URLs are left untouched. Also fixes a grammar slip in the neo-code-reviews entry meta_desc. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Attribute the changelog entries merged from master Add authors to the two changelog entries that landed on master (from their linked blog posts): versioned CLI/SDK docs (Cam Soper) and passkey support (Devon Grove). Neither is tier-gated, so no tiers. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Render only the requested releases view (no CSS-hidden media) Instead of emitting both the compact rows and expanded bodies and hiding one with CSS, changelog-item.html now renders only the caller's view — so the expanded bodies' images and autoplaying videos aren't fetched behind display:none on the list page. The modal ships only in list view, and .btn-group now lifts aria-current="page" links (not just aria-pressed buttons). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Use shared badge classes for changelog tier pills Apply master's new .badge/.badge-secondary/.badge-sm classes to the tiers array rendering instead of the hand-rolled Tailwind pill. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Attribute the neo-usage-limits changelog entry merged from master The entry came in from master without an authors field; attribute it to john-keiser, matching the companion blog post. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Update _index.md * Attribute changelog entries to Chris; make author a default Set christian-nunciato as the author on every changelog entry except the docs dark mode one (jeff-merrick). Make the author byline a default rather than opt-in: the changelog archetype now pre-fills authors: christian-nunciato, and the /new-changelog skill treats the field as included-by-default (opting out is a deliberate choice). Also refreshes the skill's stale notes (render: never, singular tier:, "no authors"). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: Christian Nunciato <c@nunciato.org>
1 parent eb7803f commit 5e80042

40 files changed

Lines changed: 376 additions & 77 deletions

.claude/commands/new-changelog.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ Creates a new changelog entry under `content/releases/changelog/` with the requi
1212

1313
- Each entry is a single markdown file in `content/releases/changelog/` (not a leaf bundle). Shared images and videos live in the `images/` and `videos/` subfolders and are referenced by absolute path (e.g. `/releases/changelog/images/foo.png`).
1414
- **Filenames must be `YYYY-MM-DD-slug.md`**, and the date prefix must match the frontmatter `date:`. `make lint` enforces both (see `scripts/lint/lint-markdown.js`, `checkChangelogFilename`).
15-
- The section `_index.md` sets `cascade.type: changelog` (routes entries to `layouts/changelog/single.html`) and `build.render: never` (no list page for the folder itself). Don't touch it when adding an entry.
16-
- These are short announcements — a paragraph or two that lead with what the reader can now do, then link to the announcement blog post and/or docs. There are no authors, tags, categories, feature images, or social copy (unlike blog posts).
15+
- The section `_index.md` sets `cascade.type: changelog` (routes entries to `layouts/changelog/single.html`) and renders the expanded `/releases/changelog/` view. Don't touch it when adding an entry.
16+
- These are short announcements — a paragraph or two that lead with what the reader can now do, then link to the announcement blog post and/or docs. They carry an **author byline** (`authors:`, included by default) and an optional pricing-`tiers:` badge, but no tags, categories, feature images, or social copy (unlike blog posts).
1717

1818
## Instructions for Claude
1919

@@ -31,7 +31,8 @@ Ask the user for the following using AskUserQuestion, seeding smart defaults:
3131
2. label: "Enter a specific date" / description: "You'll provide YYYY-MM-DD"
3232
- Replace `{current-date}` with the actual current date in `YYYY-MM-DD`. Validate any custom date matches `YYYY-MM-DD`.
3333
- **Summary (`meta_desc`)**: Suggest a concise one- or two-sentence summary (max 160 characters) based on the title. Required — the linter fails without it.
34-
- **Tier badge (optional)**: Ask whether the release applies only to a particular Pulumi product tier. Options are Team, Enterprise, and Business Critical. Default is none. Only add the `tier:` field if the user specifies one.
34+
- **Author (`authors`)**: Included by default — the archetype pre-fills the changelog's usual author (`christian-nunciato`). Confirm it, or set a different team id (from `data/team/team`) when someone else wrote the entry. Only drop the field in the rare case the entry should have no byline; opting out is a deliberate choice, not the default.
35+
- **Tiers (optional)**: Ask whether the release is gated to particular pricing tiers. The `tiers:` field is a YAML array drawn only from the four pricing tiers (Free, Team, Enterprise, Business Critical). Default is none. If gated, list **every** applicable tier — the lowest one plus all tiers above it (e.g. an Enterprise feature lists both `Enterprise` and `Business Critical`). `make lint` enforces the set and rejects the legacy singular `tier:`.
3536

3637
If the user already provided the announcement details or a link to a blog post, use them to draft the body in Step 4 instead of asking again.
3738

@@ -56,15 +57,19 @@ If Hugo isn't available or errors, write the file directly with this frontmatter
5657
title: "Title in Title Case"
5758
date: YYYY-MM-DD
5859
meta_desc: "One- or two-sentence summary (<= 160 chars)"
59-
# tier: public preview # optional — remove if no badge
60+
authors:
61+
- christian-nunciato # the changelog's usual author — change if someone else wrote it
62+
# tiers: # optional — omit unless the feature is tier-gated
63+
# - Enterprise
64+
# - Business Critical
6065
---
6166
```
6267

6368
### 4. Fill in the entry
6469

6570
1. Remove the archetype's instructional comments from the frontmatter.
6671
2. Set `title`, `date`, and `meta_desc` to the gathered values (the archetype pre-fills `title`/`date` from the filename — verify and tidy the title).
67-
3. Add the `tier:` field only if the user specified one; otherwise omit it.
72+
3. Keep the pre-filled `authors:` field, changing the id if a different person wrote the entry (drop it only in the rare no-byline case). Add `tiers:` only if the user specified tier gating; otherwise omit it.
6873
4. Replace the placeholder body with the announcement: a short paragraph or two that lead with the reader benefit, then link out to the blog post (`/blog/...`) and/or docs (`/docs/...`). Follow `STYLE-GUIDE.md` (H1 = Title Case, H2+ = Sentence case; sentence-case running prose; lowercase common nouns like "stack").
6974
5. If the entry needs an image or video, place it in `content/releases/changelog/images/` or `.../videos/` **with a date-prefixed, lowercase-hyphenated filename** (`YYYY-MM-DD-slug.ext`, using this entry's date — e.g. `2026-07-11-command-palette.mp4`), and reference it by absolute path (e.g. `/releases/changelog/images/2026-07-11-foo.png`). `make lint` enforces the asset naming too. Markdown must end with a trailing newline.
7075

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ Individual changelog items live in `content/releases/changelog/` — one markdow
135135
- **Filenames must be `YYYY-MM-DD-<slug>.md`**, and the date prefix must match the frontmatter `date:`. `make lint` enforces both (`checkChangelogFilename` in `scripts/lint/lint-markdown.js`) — a mismatch or non-prefixed name is a hard build failure.
136136
- **Assets in `images/` and `videos/` must also be date-prefixed** as `YYYY-MM-DD-<slug>.<ext>` (use the referencing entry's date). `make lint` enforces this too (`checkChangelogAssets`). Rename the asset and update its reference together.
137137
- **Create a new entry with the `/new-changelog` skill** (or `hugo new --kind changelog content/releases/changelog/YYYY-MM-DD-<slug>.md`, which uses `archetypes/changelog.md`). The archetype derives `title` and `date` from the filename.
138+
- **Optional `tiers:`** is a YAML array marking pricing-tier availability, rendered as badge(s) beside the date. Values are a **closed set** — only the four pricing tiers (`Free`, `Team`, `Enterprise`, `Business Critical`; see `content/pricing/_index.md`), enforced by `checkChangelogTiers` in `scripts/lint/lint-markdown.js` (an out-of-set value or the legacy singular `tier:` is a hard build failure). List **every** tier the feature is available in — since a lower tier implies the tiers above it, that means the lowest applicable tier and all tiers above it (e.g. an Enterprise feature lists both `Enterprise` and `Business Critical`).
138139
- **Renaming an entry** (changing its slug) changes its URL, so add an `aliases:` entry pointing at the old `/releases/changelog/<old-slug>/` path — same SEO rule as moving any content file.
139140

140141
---

archetypes/changelog.md

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,21 @@ date: {{ substr .Name 0 10 }}
2222
# Required — the build fails the linter without it. Max length 160 characters.
2323
meta_desc:
2424

25-
# Optional tier badge shown beside the date (e.g. "public preview", "ga").
26-
# Remove this line if you don't need a badge.
27-
# tier: public preview
25+
# Who authored the entry — a YAML array of team ids from data/team/team,
26+
# rendered as an "— Name" byline. Defaults to the changelog's usual author;
27+
# change it (or, rarely, remove the field) when someone else wrote the entry.
28+
authors:
29+
- christian-nunciato
30+
31+
# Optional pricing-tier availability, shown as badge(s) beside the date. A YAML
32+
# array drawn only from the four pricing tiers (Free, Team, Enterprise, Business
33+
# Critical — see content/pricing/_index.md); `make lint` enforces the set. List
34+
# every tier the feature is available in — since a lower tier implies the tiers
35+
# above it, that means the lowest applicable tier and all tiers above it. Remove
36+
# if not tier-gated.
37+
# tiers:
38+
# - Enterprise
39+
# - Business Critical
2840
---
2941

3042
Describe what shipped in a short paragraph or two. Lead with what the reader can now do, then link out to the announcement post and/or the docs for details.

content/releases/changelog/2026-05-04-custom-vcs.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ date: 2026-05-04
44
aliases:
55
- /releases/changelog/custom-vcs/
66
meta_desc: Custom VCS integrations allow you to connect any Git or Mercurial server, including self-hosted, to Pulumi Cloud.
7+
authors:
8+
- christian-nunciato
79
---
810

911
Custom VCS integrations connect any Git or Mercurial version control system to Pulumi Cloud, including self-hosted and third-party servers. Store your authentication credentials (SSH, basic auth, or a personal access token) in a Pulumi ESC environment, point the integration at your VCS server, and push to your repository to trigger Pulumi Deployments. Pulumi Neo can also clone and push to these repositories using the same credentials.

content/releases/changelog/2026-05-05-neo-task-notifications.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ date: 2026-05-05
44
aliases:
55
- /releases/changelog/neo-task-notifications/
66
meta_desc: Neo can now notify you when a task needs your input, through native desktop notifications, an audible sound, or both.
7+
authors:
8+
- christian-nunciato
79
---
810

911
Neo can now notify you when a task needs your input, either through native desktop notifications, an audible sound, or both. As you delegate more tasks to Neo and work more asynchronously, you'll know right away whenever Neo is finished and waiting for you.

content/releases/changelog/2026-05-13-pulumi-cloud-console-refresh.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ date: 2026-05-13
44
aliases:
55
- /releases/changelog/pulumi-cloud-console-refresh/
66
meta_desc: The Pulumi Cloud console has a refreshed look, with richer controls, new navigation, greater information density, and more.
7+
authors:
8+
- christian-nunciato
79
---
810

911
The Pulumi Cloud console has a refreshed look: new colors; more consistent controls like inputs, selects, and buttons; a new collapsible sidebar with condensed hierarchical navigation; new layouts for tabular data; a new resource graph display; and much more.

content/releases/changelog/2026-05-15-team-membership-members-tab.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ date: 2026-05-15
44
aliases:
55
- /releases/changelog/team-membership-members-tab/
66
meta_desc: The Members tab in Access Management now indicates which teams every organization member belongs to.
7+
authors:
8+
- christian-nunciato
79
---
810

911
The Members tab in Access Management now shows which teams each member of your organization belongs to. Before, you had to open each team individually to see who was on it; now the full picture is on one page, under **Settings** > **Access Management** > **Members**.

content/releases/changelog/2026-05-22-esc-change-request-edit-review.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ date: 2026-05-22
44
aliases:
55
- /releases/changelog/esc-change-request-edit-review/
66
meta_desc: Pulumi ESC change requests now separate editing a draft from reviewing one, with deep-linkable modes so several people can co-edit before approval.
7-
tier: Enterprise
7+
authors:
8+
- christian-nunciato
9+
tiers:
10+
- Enterprise
11+
- Business Critical
812
---
913

1014
Pulumi ESC change requests now cleanly separate editing a draft from reviewing one. The editor is always where you change the new version, the approval page is a read-only diff, and a banner on the environment lets you flip between the two. Both modes are deep-linkable, so you can send a coworker a URL to review — or co-edit — the same draft before it's approved.

content/releases/changelog/2026-05-28-pulumi-service-provider-v1.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ date: 2026-05-28
44
aliases:
55
- /releases/changelog/pulumi-service-provider-v1/
66
meta_desc: The Pulumi Service Provider has reached v1.0 and is now generated from the public Pulumi Cloud OpenAPI specification.
7+
authors:
8+
- christian-nunciato
79
---
810

911
The [Pulumi Service Provider](/registry/packages/pulumiservice/) has officially [reached v1.0](/blog/generating-a-pulumi-provider-from-an-openapi-spec/#whats-new-in-v10) and is now generated from the public Pulumi Cloud [OpenAPI specification](/docs/reference/cloud-rest-api/), which commits to a stable contract for the existing resource surface and keeps the provider up to date automatically.

content/releases/changelog/2026-06-05-git-tag-deployments.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ date: 2026-06-05
44
aliases:
55
- /releases/changelog/git-tag-deployments/
66
meta_desc: You can now push a Git tag to trigger a Pulumi deployment from any supported service, including GitHub, GitLab, Bitbucket, Azure DevOps, and more.
7+
authors:
8+
- christian-nunciato
79
---
810

911
You can now push a Git tag to your Pulumi Cloud-connected version control system to trigger a Pulumi deployment. Available to all Pulumi Cloud organizations, this new feature also supports optional glob filters and works across any supported VCS, including GitHub, GitLab, Bitbucket, Azure DevOps, and custom integrations.

0 commit comments

Comments
 (0)