New to Kestra?
Use blueprints to kickstart your first workflows.
Celebrate community milestones on Bluesky automatically with Kestra. An analytics webhook posts the metric and count as a skeet and notes it in Discord.
Milestones are the community's wins, and they land best when announced while the number is fresh, not a week later in a roundup. This blueprint automates that moment: when your analytics system detects a metric crossing a threshold, such as members, stars, or downloads, it POSTs a small JSON payload to a Kestra webhook, io.kestra.plugin.bluesky.BlueskyExecution posts an execution-notification skeet carrying the thank-you message through the project's Bluesky account, and Discord records internally that the milestone went public. On Bluesky, where developer communities follow projects directly, these posts consistently earn the warmest engagement a project account gets.
The skeet is public the instant the task succeeds, so the wording is deliberately fixed in the flow and only the numbers vary. Choose the milestone thresholds carefully upstream in the analytics system, because every webhook call becomes a public post. The post also wears its automation openly. It opens with the execution state and flow id and closes with a link to the execution, and a community that likes seeing the machinery behind a project tends to enjoy exactly that.
analytics_webhook trigger (io.kestra.plugin.core.trigger.Webhook) exposes a URL your analytics or monitoring system POSTs to with metric and count in the JSON body when a threshold is crossed.post_milestone (io.kestra.plugin.bluesky.BlueskyExecution) authenticates with the handle and app password from secrets and posts the celebration, with the numeric count interpolated directly into the customMessage sentence.RUNNING: company.team/bluesky-community-milestone, then the custom message, and closes with a link to the execution in the Kestra UI. Bluesky's 300-grapheme limit applies to that whole rendered post, which the fixed wording plus the status line and link fits comfortably.??) on both fields let the flow run manually with inputs, useful for milestones spotted by a human before the analytics system fires.note_internally posts the count and execution id to Discord, and the errors block raises a distinct alert when posting failed, because a missed celebration is invisible unless something reports it.An analytics alert that posts straight to a social API hides the credential in the alerting tool and fails silently when the API hiccups. In Kestra the app password stays in the secret store, every public post is an auditable execution tied to the payload that caused it, a transient Bluesky error is retryable, and a failed post alerts Discord instead of vanishing. The webhook boundary also keeps the analytics system decoupled from how and where the celebration is published.
BLUESKY_IDENTIFIER: the Bluesky handle, for example yourproject.bsky.social.BLUESKY_APP_PASSWORD: an app password generated in Bluesky settings.DISCORD_WEBHOOK_URL: Discord incoming webhook URL.metric and count to the webhook URL when a milestone threshold is crossed.message field to the webhook payload and feed it into customMessage for milestone-specific wording, keeping a fallback default, or move the raw figures into a customFields map so each number renders on its own line.post_milestone, as shown in the blog announcer blueprint.