From 338984859834a2ca13b0f2556019bb079a47d057 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Tue, 5 May 2026 17:32:22 +0200 Subject: [PATCH 1/3] wip:1 (wm951) --- docs/release-notes/6.3.0/announcements/slack.md | 10 ++++++---- docs/release-notes/6.3.0/announcements/social.md | 12 +++++------- scripts/generate-announcements.ts | 12 ++++++------ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/release-notes/6.3.0/announcements/slack.md b/docs/release-notes/6.3.0/announcements/slack.md index 0790a4a2f..3ba4b060c 100644 --- a/docs/release-notes/6.3.0/announcements/slack.md +++ b/docs/release-notes/6.3.0/announcements/slack.md @@ -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 release brings AI PowerUps to Webiny — you can now configure OpenAI or Anthropic in Admin settings and generate page content directly in the Website Builder using natural language prompts. Images uploaded to the File Manager are automatically enriched with AI-generated tags and descriptions, making them much easier to find later. -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 side, there's a lot to dig into: TypeScript has been upgraded to 6.0.3, the new FormModel API gives you a declarative way to build admin forms, background tasks can now self-clean after completion, and the SDK gains a full tasks module for interacting with background jobs from external apps. We've also added a built-in encryption service, improved input validation across the SDK, and fixed a handful of infrastructure and deployment issues. + +The Admin UI gets a reorganised sidebar with a new Dev Tools section, Page Settings has been rebuilt on the FormModel architecture for easier extensibility, and there's a stack of new documentation covering custom API routes, encryption, form models, and more. 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 one — now go build something smart! :zap: +Lots of AI goodness in this one — go play with it and let us know what you build! :sparkles: diff --git a/docs/release-notes/6.3.0/announcements/social.md b/docs/release-notes/6.3.0/announcements/social.md index 75619c47e..02f61ad97 100644 --- a/docs/release-notes/6.3.0/announcements/social.md +++ b/docs/release-notes/6.3.0/announcements/social.md @@ -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 — a new feature set that brings AI-powered content generation to the Website Builder and automatic image enrichment to the File Manager. Configure your OpenAI or Anthropic provider in Admin settings, then generate page sections using natural language prompts or let uploaded images automatically receive AI-generated tags and descriptions. -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 developers, there's a new declarative FormModel API for building admin forms, a Tasks SDK module for interacting with background tasks from external applications, and improved input validation across all SDK methods. The encryption service is now built in, TypeScript has been upgraded to 6.0.3, and Pulumi extensions finally have proper typing. -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 improvements include self-cleaning background tasks, mailer configuration via webiny.config.ts, and fixes for duplicate resource URNs when registering multiple API routes. -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. +We'd love to hear what you build with AI PowerUps — share your experience! 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 diff --git a/scripts/generate-announcements.ts b/scripts/generate-announcements.ts index e4c519366..c3515ac24 100644 --- a/scripts/generate-announcements.ts +++ b/scripts/generate-announcements.ts @@ -106,13 +106,12 @@ 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" @@ -120,9 +119,10 @@ Structure: 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. `.trim(); From a299db9b3851b17d437352eb445eb8849dce3ec7 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Tue, 5 May 2026 18:18:08 +0200 Subject: [PATCH 2/3] wip:2 (qzik7) --- .github/workflows/release-announcements.yml | 4 ++- .../6.3.0/announcements/tweets.md | 13 +++++++ scripts/generate-announcements.ts | 35 ++++++++++++++++--- 3 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 docs/release-notes/6.3.0/announcements/tweets.md diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 22bb77969..d66c24bda 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -60,11 +60,13 @@ jobs: BASE="docs/release-notes/${VERSION}/announcements" SLACK_URL="${REPO_URL}/blob/master/${BASE}/slack.md" SOCIAL_URL="${REPO_URL}/blob/master/${BASE}/social.md" + TWEETS_URL="${REPO_URL}/blob/master/${BASE}/tweets.md" jq -n \ --arg version "$VERSION" \ --arg slack_url "$SLACK_URL" \ --arg social_url "$SOCIAL_URL" \ + --arg tweets_url "$TWEETS_URL" \ '{ "text": ("Release " + $version + " announcements ready"), "blocks": [ @@ -79,7 +81,7 @@ jobs: "type": "section", "text": { "type": "mrkdwn", - "text": ("• *Slack* — <" + $slack_url + "|view / edit>\n• *X / LinkedIn* — <" + $social_url + "|view / edit>") + "text": ("• *Slack* — <" + $slack_url + "|view / edit>\n• *X / LinkedIn* — <" + $social_url + "|view / edit>\n• *Follow-up tweets* — <" + $tweets_url + "|view / edit>") } }, { diff --git a/docs/release-notes/6.3.0/announcements/tweets.md b/docs/release-notes/6.3.0/announcements/tweets.md new file mode 100644 index 000000000..689753f69 --- /dev/null +++ b/docs/release-notes/6.3.0/announcements/tweets.md @@ -0,0 +1,13 @@ +Excited to share that Webiny now has AI PowerUps! Configure OpenAI or Anthropic in Admin settings, then generate page content directly in the Website Builder using natural language prompts. The AI output automatically converts to Lexical editor format. 🤖 https://www.webiny.com/docs/release-notes/6.3.0/changelog + +--- + +Images uploaded to File Manager now get automatically enriched with AI-generated tags and descriptions. Runs as a background task so uploads stay fast, and you can always edit the metadata manually afterward. https://www.webiny.com/docs/release-notes/6.3.0/changelog + +--- + +The new FormModel API lets you build admin forms declaratively with tabs, validation, computed fields, dynamic zones, and focus management. Powers internal Webiny forms and is fully available for extension developers building custom interfaces. https://www.webiny.com/docs/release-notes/6.3.0/changelog + +--- + +External apps can now interact with Background Tasks through the SDK. List definitions, trigger executions, fetch logs, abort running tasks — the new `sdk.tasks` module has you covered with full TypeScript support. https://www.webiny.com/docs/release-notes/6.3.0/changelog diff --git a/scripts/generate-announcements.ts b/scripts/generate-announcements.ts index c3515ac24..3cb661253 100644 --- a/scripts/generate-announcements.ts +++ b/scripts/generate-announcements.ts @@ -127,6 +127,30 @@ Rules: - Do NOT use bullet points or numbered lists anywhere. `.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. +- 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. +`.trim(); + // --------------------------------------------------------------------------- // Claude calls // --------------------------------------------------------------------------- @@ -185,11 +209,12 @@ async function main(): Promise { } 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"); @@ -197,7 +222,8 @@ async function main(): Promise { const files: Array<[string, string]> = [ ["slack.md", slack], - ["social.md", social] + ["social.md", social], + ["tweets.md", tweets] ]; for (const [filename, content] of files) { @@ -207,6 +233,7 @@ async function main(): Promise { printSection("SLACK", slack); printSection("SOCIAL (X / LinkedIn)", social); + printSection("FOLLOW-UP TWEETS", tweets); console.log(); } From d7a28db85a1e21c27d27288c543667a079c36682 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Wed, 6 May 2026 12:43:30 +0200 Subject: [PATCH 3/3] wip: improve release announcements workflow and prompts Co-Authored-By: Claude Sonnet 4.6 (1M context) --- .github/workflows/release-announcements.yml | 32 ++++++++++++++----- .../6.3.0/announcements/slack.md | 8 ++--- .../6.3.0/announcements/social.md | 10 +++--- .../6.3.0/announcements/tweets.md | 16 +++++++--- scripts/generate-announcements.ts | 14 ++++++++ 5 files changed, 59 insertions(+), 21 deletions(-) diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index d66c24bda..4b764d219 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -13,6 +13,7 @@ jobs: runs-on: ubuntu-latest permissions: contents: write + pull-requests: write steps: - name: Extract version from branch name @@ -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: @@ -58,30 +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" - TWEETS_URL="${REPO_URL}/blob/master/${BASE}/tweets.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>\n• *Follow-up tweets* — <" + $tweets_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>") } }, { diff --git a/docs/release-notes/6.3.0/announcements/slack.md b/docs/release-notes/6.3.0/announcements/slack.md index 3ba4b060c..a4fd3eb19 100644 --- a/docs/release-notes/6.3.0/announcements/slack.md +++ b/docs/release-notes/6.3.0/announcements/slack.md @@ -2,11 +2,11 @@ Hello @channel! :wave: Webiny 6.3.0 is out! :rocket: -This release brings AI PowerUps to Webiny — you can now configure OpenAI or Anthropic in Admin settings and generate page content directly in the Website Builder using natural language prompts. Images uploaded to the File Manager are automatically enriched with AI-generated tags and descriptions, making them much easier to find later. +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 lot to dig into: TypeScript has been upgraded to 6.0.3, the new FormModel API gives you a declarative way to build admin forms, background tasks can now self-clean after completion, and the SDK gains a full tasks module for interacting with background jobs from external apps. We've also added a built-in encryption service, improved input validation across the SDK, and fixed a handful of infrastructure and deployment issues. +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. -The Admin UI gets a reorganised sidebar with a new Dev Tools section, Page Settings has been rebuilt on the FormModel architecture for easier extensibility, and there's a stack of new documentation covering custom API routes, encryption, form models, and more. Check out the changelog to learn more. +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. — @@ -16,4 +16,4 @@ How To Upgrade: https://www.webiny.com/docs/release-notes/6.3.0/upgrade-guide — -Lots of AI goodness in this one — go play with it and let us know what you build! :sparkles: +Lots of exciting stuff packed into this release — can't wait to see what you build with it! :rocket: diff --git a/docs/release-notes/6.3.0/announcements/social.md b/docs/release-notes/6.3.0/announcements/social.md index 02f61ad97..a23a4cb8e 100644 --- a/docs/release-notes/6.3.0/announcements/social.md +++ b/docs/release-notes/6.3.0/announcements/social.md @@ -1,12 +1,12 @@ -Webiny 6.3.0 is here 🚀 +Webiny 6.3.0 is here! 🚀 -This release introduces AI PowerUps — a new feature set that brings AI-powered content generation to the Website Builder and automatic image enrichment to the File Manager. Configure your OpenAI or Anthropic provider in Admin settings, then generate page sections using natural language prompts or let uploaded images automatically receive AI-generated tags and descriptions. +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. -For developers, there's a new declarative FormModel API for building admin forms, a Tasks SDK module for interacting with background tasks from external applications, and improved input validation across all SDK methods. The encryption service is now built in, TypeScript has been upgraded to 6.0.3, and Pulumi extensions finally have proper typing. +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. -Infrastructure improvements include self-cleaning background tasks, mailer configuration via webiny.config.ts, and fixes for duplicate resource URNs when registering multiple API routes. +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. -We'd love to hear what you build with AI PowerUps — share your experience! +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 diff --git a/docs/release-notes/6.3.0/announcements/tweets.md b/docs/release-notes/6.3.0/announcements/tweets.md index 689753f69..cd15cba73 100644 --- a/docs/release-notes/6.3.0/announcements/tweets.md +++ b/docs/release-notes/6.3.0/announcements/tweets.md @@ -1,13 +1,21 @@ -Excited to share that Webiny now has AI PowerUps! Configure OpenAI or Anthropic in Admin settings, then generate page content directly in the Website Builder using natural language prompts. The AI output automatically converts to Lexical editor format. 🤖 https://www.webiny.com/docs/release-notes/6.3.0/changelog +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 --- -Images uploaded to File Manager now get automatically enriched with AI-generated tags and descriptions. Runs as a background task so uploads stay fast, and you can always edit the metadata manually afterward. 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 FormModel API lets you build admin forms declaratively with tabs, validation, computed fields, dynamic zones, and focus management. Powers internal Webiny forms and is fully available for extension developers building custom interfaces. 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 --- -External apps can now interact with Background Tasks through the SDK. List definitions, trigger executions, fetch logs, abort running tasks — the new `sdk.tasks` module has you covered 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 diff --git a/scripts/generate-announcements.ts b/scripts/generate-announcements.ts index 3cb661253..1b56a7b0f 100644 --- a/scripts/generate-announcements.ts +++ b/scripts/generate-announcements.ts @@ -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: @@ -125,6 +130,10 @@ Rules: - 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 = ` @@ -140,6 +149,8 @@ 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. @@ -149,6 +160,9 @@ Rules: - 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(); // ---------------------------------------------------------------------------