Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 25 additions & 7 deletions .github/workflows/release-announcements.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ jobs:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write

steps:
- name: Extract version from branch name
Expand Down Expand Up @@ -43,13 +44,25 @@ jobs:
CLAUDE_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: yarn generate:announcements --version ${{ env.VERSION }}

- name: Commit and push announcements to master
- name: Commit and push announcements to branch
run: |
git config user.name "webiny-bot"
git config user.email "webiny-bot@webiny.com"
git checkout -b release-announcements/${{ env.VERSION }}
git add docs/release-notes/${{ env.VERSION }}/announcements/
git commit -m "chore: add announcements for ${{ env.VERSION }}"
git push origin master
git push origin release-announcements/${{ env.VERSION }}

- name: Create PR
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
PR_URL=$(gh pr create \
--title "chore: add announcements for ${{ env.VERSION }}" \
--body "Release announcements for ${{ env.VERSION }} — please review and merge to publish." \
--base master \
--head release-announcements/${{ env.VERSION }})
echo "PR_URL=$PR_URL" >> $GITHUB_ENV

- name: Send Slack announcement
env:
Expand All @@ -58,28 +71,33 @@ jobs:
run: |
VERSION="${{ env.VERSION }}"
BASE="docs/release-notes/${VERSION}/announcements"
SLACK_URL="${REPO_URL}/blob/master/${BASE}/slack.md"
SOCIAL_URL="${REPO_URL}/blob/master/${BASE}/social.md"
ANNOUNCE_BRANCH="release-announcements/${VERSION}"
SLACK_URL="${REPO_URL}/blob/${ANNOUNCE_BRANCH}/${BASE}/slack.md"
SOCIAL_URL="${REPO_URL}/blob/${ANNOUNCE_BRANCH}/${BASE}/social.md"
TWEETS_URL="${REPO_URL}/blob/${ANNOUNCE_BRANCH}/${BASE}/tweets.md"
PR_URL="${{ env.PR_URL }}"

jq -n \
--arg version "$VERSION" \
--arg pr_url "$PR_URL" \
--arg slack_url "$SLACK_URL" \
--arg social_url "$SOCIAL_URL" \
--arg tweets_url "$TWEETS_URL" \
'{
"text": ("Release " + $version + " announcements ready"),
"text": ("Release " + $version + " announcements ready for review"),
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ("*Release " + $version + " docs merged* — announcements ready :tada:")
"text": ("*Release " + $version + " announcements ready* — please review and merge :eyes:")
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ("• *Slack* — <" + $slack_url + "|view / edit>\n• *X / LinkedIn* — <" + $social_url + "|view / edit>")
"text": ("• *PR* — <" + $pr_url + "|review / merge>\n• *Slack* — <" + $slack_url + "|view / edit>\n• *X / LinkedIn* — <" + $social_url + "|view / edit>\n• *Follow-up tweets* — <" + $tweets_url + "|view / edit>")
}
},
{
Expand Down
10 changes: 6 additions & 4 deletions docs/release-notes/6.3.0/announcements/slack.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,18 @@ Hello @channel! :wave:

Webiny 6.3.0 is out! :rocket:

This is a big one for AI capabilities! We've introduced AI PowerUps that let you generate page content directly in the Website Builder using OpenAI or Anthropic. Plus, images uploaded to File Manager now automatically get AI-generated tags and descriptions for better searchability — all happening in the background so it doesn't slow you down.
This is a big one! We're introducing AI PowerUps you can now configure OpenAI or Anthropic in your Admin settings and use AI to generate page content directly in the Website Builder. Plus, images uploaded to the File Manager automatically get AI-generated tags and descriptions for better searchability.

On the developer side, there's a ton of goodies: a new declarative FormModel API for building admin forms, a Tasks SDK module for interacting with background tasks, a built-in encryption service, and mailer configuration now lives in your webiny.config.ts. We've also upgraded TypeScript to 6.0.3 and Storybook to v10.
On the developer experience side, there's a ton of improvements. The new FormModel API gives you a declarative way to build admin forms, the SDK now includes a tasks module for managing background tasks from external apps, and we've added a built-in encryption service for handling sensitive data. TypeScript has been upgraded to 6.0.3, and there's better input validation with more descriptive errors across the board.

We've also reorganised the admin sidebar with a new Dev Tools section, rebuilt Page Settings using the FormModel architecture with proper extension points, and added mailer configuration directly in webiny.config.ts. Check out the changelog to learn more.

The Admin UI got some love too — the new Dev Tools sidebar section keeps GraphQL and SDK Playground handy, and Page Settings has been completely rebuilt with the new FormModel architecture, making it much easier to extend. Check out the changelog to learn more.

As usual, the release notes can be found on the following links:point_down::skin-tone-2::
Changelog: https://www.webiny.com/docs/release-notes/6.3.0/changelog
How To Upgrade: https://www.webiny.com/docs/release-notes/6.3.0/upgrade-guide


Lots of AI magic in this onenow go build something smart! :zap:
Lots of exciting stuff packed into this releasecan't wait to see what you build with it! :rocket:
12 changes: 5 additions & 7 deletions docs/release-notes/6.3.0/announcements/social.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
Webiny 6.3.0 is here, and it's one of our most feature-rich releases yet 🚀
Webiny 6.3.0 is here! 🚀

This release introduces AI PowerUps, bringing intelligent content generation directly into the Website Builder. Configure OpenAI or Anthropic in your Admin settings, then use natural language prompts to generate page sections and content. The File Manager also gets smarter — uploaded images are now automatically enriched with AI-generated tags and descriptions, making your media library instantly more searchable without manual effort.
This release introduces AI PowerUps — you can now connect OpenAI or Anthropic in Admin settings and generate page content directly in Website Builder using natural language prompts. Images uploaded to File Manager are automatically enriched with AI-generated tags and descriptions, making assets easier to find without manual metadata entry.

The admin interface sees several quality-of-life improvements. A new Dev Tools sidebar section consolidates the GraphQL Playground and SDK Playground links with proper permission controls. The new DatePicker component supports everything from simple date selection to date ranges and multiple selections. Page Settings has been completely rebuilt using our new FormModel architecture, making it far easier to extend with custom settings groups and fields.
For extension developers, there's a lot to dig into. The new FormModel API provides a declarative way to build admin forms with tabs, validation, computed fields, and dynamic zones. The SDK now includes a tasks module for triggering and managing background tasks from external apps, and all SDK methods validate inputs before hitting the network with descriptive error messages when something's off.

For developers, this release brings a powerful new FormModel API for building declarative admin forms with tabs, validation, computed fields, and conditional logic. The SDK now includes a tasks module for triggering and managing background tasks from external applications. Speaking of background tasks, they can now be configured to clean up after themselves automatically. We've also added a built-in encryption service using AES-256-GCM, and the mailer now supports configuration directly in webiny.config.ts.
Infrastructure and deployment also got attention — a built-in encryption service is available in the API layer, Pulumi extensions now have proper TypeScript typing, and old Pulumi plugin versions clean themselves up automatically.

On the infrastructure side, TypeScript has been upgraded to 6.0.3, Storybook to version 10, and numerous dependency updates improve security and compatibility. The upgrade command now includes a force flag and better default logging, while old Pulumi plugin versions are automatically cleaned up to save disk space.

We're excited to see what you build with these new capabilities. Give 6.3.0 a try and let us know what you think.
Check the full changelog and let us know what you're building with these new capabilities.

Changelog: https://www.webiny.com/docs/release-notes/6.3.0/changelog
Upgrade guide: https://www.webiny.com/docs/release-notes/6.3.0/upgrade-guide
21 changes: 21 additions & 0 deletions docs/release-notes/6.3.0/announcements/tweets.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
Fresh in Webiny 6.3.0 — AI PowerUps let you generate page content directly in the Website Builder using natural language prompts. Configure your OpenAI or Anthropic connection in Admin settings and let AI draft sections while you focus on the bigger picture.

https://www.webiny.com/docs/release-notes/6.3.0/changelog

---

Ever upload an image and immediately forget what it was? Webiny's File Manager now enriches uploads automatically — AI analyzes each image and assigns tags plus a description, all in the background. Search just got smarter. 🔍

https://www.webiny.com/docs/release-notes/6.3.0/changelog

---

The new Tasks SDK module opens up background task orchestration to external applications. List definitions, trigger runs, fetch logs, abort jobs — all through the SDK with full TypeScript support.

https://www.webiny.com/docs/release-notes/6.3.0/changelog

---

Need to encrypt sensitive values in your API extensions? Webiny 6.3.0 ships with a built-in encryption service using AES-256-GCM. Inject `Encryption` into any feature and you're set — no external dependencies required.

https://www.webiny.com/docs/release-notes/6.3.0/changelog
61 changes: 51 additions & 10 deletions scripts/generate-announcements.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,11 @@ Rules:
- Do NOT add any extra sections, bullet lists, or formatting beyond what is described above.
- "Webiny" is always capitalised.
- Keep the whole message short — it should be readable in 30 seconds.
- Do NOT mention CLI flags, upgrade command options, logging settings, or other low-level tooling
details (e.g. --force flags, default logging changes). Focus on product and developer experience.
- Do NOT mention low-level infrastructure internals in the highlights — no Pulumi hooks, env hooks,
plugin cleanup, OpenSearch prefixing, or deployment plumbing. If infra improvements are worth
mentioning at all, describe them in terms of developer benefit, not implementation details.

Here is a real example of the style to match:

Expand All @@ -106,25 +111,58 @@ Use blank lines between paragraphs.

Structure:

- Opening hook (1–2 sentences): grab attention, announce the release. Make it feel significant.
- Opening line: announce the release. 1 sentence.
- Blank line
- 2–4 body paragraphs: each covers a theme from the changelog. Write in a professional but warm tone.
Be specific about what changed and why it matters to developers or teams using Webiny.
Each paragraph 2–4 sentences.
- 2–3 body paragraphs. Group changes into themes rather than listing every item. Each paragraph
1–3 sentences. Be warm and specific but don't try to cover everything — pick the highlights.
- Blank line
- Closing paragraph: forward-looking, invite engagement (e.g. "Give it a try and let us know what you think.").
- Closing line: forward-looking, invite engagement. 1 sentence.
- Blank line
- Links (plain text):
"Changelog: https://www.webiny.com/docs/release-notes/VERSION/changelog"
"Upgrade guide: https://www.webiny.com/docs/release-notes/VERSION/upgrade-guide"

Rules:
- Replace VERSION with the actual release version number in the URLs.
- Use real Unicode emoji very sparingly — at most 2 in the entire post, only in the opening or closing.
- Use real Unicode emoji very sparingly — at most 1 in the entire post, only in the opening or closing.
- "Webiny" is always capitalised.
- Tone: professional, developer-focused, enthusiastic but not hype-y.
- Keep the whole post short — roughly the same length as a Slack announcement.
- Do NOT use hashtags.
- Do NOT use bullet points or numbered lists anywhere.
- Do NOT mention CLI flags, upgrade command options, logging settings, or low-level infrastructure
details (e.g. Pulumi internals, env hooks, --force flags). Stick to product and developer experience highlights.
- Do NOT end with a catch-all paragraph listing minor fixes. If there's nothing left worth highlighting
at that point, stop — the closing line is enough.
`.trim();

const FOLLOWUP_TWEETS_PROMPT = `
You write follow-up tweets for Webiny releases. Webiny is an open-source serverless CMS platform.
These tweets will be posted one per day in the days after the release to keep content flowing.

Pick 3–4 of the most interesting features or improvements from the changelog. Write one standalone
tweet per feature. Each tweet must work completely on its own — no references to "yesterday's release"
or numbering like "1/4".

Format: separate each tweet with a blank line and a "---" divider.

Each tweet:
- 1–3 sentences. Focused on one specific thing.
- Concrete and specific — name the actual feature, explain what it does or why it matters.
- Vary the structure — don't make every tweet feel the same. Some can open with a question,
some can frame a problem the feature solves, some can just lead with the capability.
- End with the changelog link: https://www.webiny.com/docs/release-notes/VERSION/changelog
- At most 1 emoji per tweet, only where genuinely fitting.

Rules:
- Replace VERSION with the actual release version number in the URL.
- "Webiny" is always capitalised.
- Tone: excited but technical. Speak to developers.
- Do NOT use hashtags.
- Do NOT start every tweet with "Webiny" — vary the openings.
- Do NOT use backticks or any code formatting — plain text only.
- Do NOT mention CLI flags, upgrade command options, logging settings, or low-level infrastructure
details. Focus on product and developer experience.
`.trim();

// ---------------------------------------------------------------------------
Expand Down Expand Up @@ -185,19 +223,21 @@ async function main(): Promise<void> {
}
const client = new Anthropic({ apiKey });

console.log(" Generating Slack and social posts in parallel...");
console.log(" Generating Slack, social, and follow-up tweets in parallel...");

const [slack, social] = await Promise.all([
const [slack, social, tweets] = await Promise.all([
generate(client, SLACK_PROMPT, changelog, version, "Slack"),
generate(client, SOCIAL_PROMPT, changelog, version, "social")
generate(client, SOCIAL_PROMPT, changelog, version, "social"),
generate(client, FOLLOWUP_TWEETS_PROMPT, changelog, version, "follow-up tweets")
]);

const outDir = join(process.cwd(), "docs", "release-notes", version, "announcements");
mkdirSync(outDir, { recursive: true });

const files: Array<[string, string]> = [
["slack.md", slack],
["social.md", social]
["social.md", social],
["tweets.md", tweets]
];

for (const [filename, content] of files) {
Expand All @@ -207,6 +247,7 @@ async function main(): Promise<void> {

printSection("SLACK", slack);
printSection("SOCIAL (X / LinkedIn)", social);
printSection("FOLLOW-UP TWEETS", tweets);

console.log();
}
Expand Down