Schedule icon
Not icon
PublicHoliday icon
Request icon
ForEach icon
Return icon
Set icon
ListEvents icon
Update icon
If icon
SlackIncomingWebhook icon

Weekly recap of GitHub issues and Google Calendar meetings sent to Confluence

Automate a Friday Confluence recap page summarizing closed GitHub issues and Google Calendar meetings, with a Slack notification, orchestrated by Kestra.

Categories
Business

Automate a weekly status update by collecting closed GitHub issues and pull requests, fetching the past week of Google Calendar meetings, then publishing the totals to a Confluence page and posting a Slack summary. This recap blueprint replaces the manual end-of-week ritual of scraping GitHub notifications, copying meeting counts from your calendar, and pasting them into a wiki page. It runs every Friday afternoon (skipping US public holidays) and keeps a versioned Confluence page so your team can scroll back through previous weeks without losing history.

How it works

  1. A Schedule trigger fires every Friday at 16:00, gated by a PublicHoliday condition (country: US) wrapped in Not so the flow skips US holidays.
  2. get_issues calls the GitHub REST API with io.kestra.plugin.core.http.Request, filtering issues assigned to the authenticated user, closed in the last 5 days.
  3. for_each_issue (io.kestra.plugin.core.flow.ForEach) walks the response, logs each issue URL with io.kestra.plugin.core.debug.Return, and uses io.kestra.plugin.core.kv.Set to store a running count in the issues_today KV key.
  4. get_calendar_events uses io.kestra.plugin.googleworkspace.calendar.ListEvents with a service account to pull meetings between 07:00 last Monday and 17:00 today (US Central).
  5. for_each iterates the calendar metadata, logging each htmlLink and updating the meetings_today KV counter the same way.
  6. send_to_confluence calls io.kestra.plugin.confluence.pages.Update to overwrite a fixed pageId titled "Weekly Recaps" with a markdown body containing the meeting and issue totals, bumping the page version from the version_number KV key.
  7. increment_version_number writes the next version back to KV so the Confluence API accepts the next update.
  8. check_for_events (io.kestra.plugin.core.flow.If) branches on whether any meetings happened, sending either a populated or a "no activity" message via io.kestra.plugin.slack.notifications.SlackIncomingWebhook.

What you get

  • A self-maintaining "Weekly Recaps" Confluence page versioned every Friday.
  • Slack notification in the channel of your choice with the same numbers.
  • KV-backed counters you can reuse in other flows or dashboards.
  • Holiday-aware scheduling so the recap does not fire on US public holidays.

Who it's for

  • Engineering managers who want a no-effort weekly status artifact.
  • Developer experience and PMM teams reporting throughput to leadership.
  • Anyone keeping a Confluence team space up to date without manual copy-paste.

Why orchestrate this with Kestra

Confluence has no native scheduler that can read GitHub, query Google Calendar, branch on results, and write back to a page. Kestra wires those services together declaratively in YAML, with retries and event triggers, full execution logs and outputs for lineage, KV state to track page versions across runs, and one Schedule trigger that gates on public holidays without extra glue code. Each task output is captured, so you can audit exactly which issues and meetings landed on any given week.

Prerequisites

  • GitHub personal access token with repo scope for the target organization.
  • Confluence Cloud or Server instance with a page already created for the recap.
  • Google Workspace service account JSON with read access to the target calendar.
  • Slack incoming webhook URL for the channel that should receive the summary.

Secrets

  • CLASSIC_GITHUB: GitHub personal access token used in the Authorization: Bearer header.
  • NEW_SA_GCAL: Google Workspace service account JSON for Calendar API access.
  • CALENDARID: Google Calendar ID to read events from.
  • CONFLUENCE_API: Confluence API token.
  • CONFLUENCE_SERVER_URL: Base URL of your Confluence instance.
  • EMAIL: Email address used as the Confluence username.
  • PAGE_ID: ID of the Confluence page to update.
  • SLACK_WEBHOOK: Slack incoming webhook URL.

Quick start

  1. Add all secrets above in your Kestra instance under Namespace Secrets or environment variables.
  2. Create the target Confluence page once, note its pageId, and seed a version_number KV entry equal to the current page version.
  3. Update namespace if company.team is not where you want the flow to live.
  4. Adjust the cron in weekly_wrapup if Friday 16:00 UTC is not your end-of-week.
  5. Run the flow manually once to verify the Confluence page updates and Slack message arrives.

How to extend

  • Swap the GitHub query for a different filter, repository, or label to scope to a team.
  • Replace the Confluence task with io.kestra.plugin.notion.pages.Update to publish to Notion instead.
  • Add a Subflow task that emails the same recap with io.kestra.plugin.notifications.mail.MailSend.
  • Persist weekly totals to BigQuery or Postgres with the matching plugin tasks for long-term trend dashboards.
  • Add more KV counters (commits merged, deploys shipped) by chaining additional HTTP requests before the Confluence update.

Links

See How

New to Kestra?

Use blueprints to kickstart your first workflows.