Daily
Post a daily engineering digest from GitHub in Slack
Each morning before standup, Slack shows what merged yesterday, which pull requests are waiting for review and which issues were opened.
- Runs
- Daily
- Apps
- GitHub, Slack
- AI
- Optional
- Access
- read repo; chat:write
Send this to your assistant
Create a ClickRuntime automation: every weekday at 9:15, post to #eng a summary of yesterday's merged PRs, open PRs waiting on review and new issues in our repos.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A product team of eight holds a daily standup that keeps running long, because half of it is people reading out what they merged and asking who can review what. The information is all in GitHub, just scattered across repositories.
A digest posted before the meeting covers the status update in writing. Standup becomes a short conversation about blockers, and reviewers see what is waiting for them before anyone has to ask.
What you get out of it
Shorter standups
The status part of the meeting is already in Slack. Time together goes on problems, not recaps.
Reviews do not stall
Pull requests waiting for review are listed with their age. Old ones get picked up instead of sitting for days.
Everyone sees all repositories
Work across several repositories appears in one message. People notice changes in parts of the system they do not usually watch.
A readable summary if you want one
With AI turned on, the digest opens with a few plain sentences about the day's themes. Product managers and leads get the gist without reading every title.
How it works
What happens, step by step
Every weekday morning, ClickRuntime searches your GitHub repositories for pull requests merged yesterday.
It also finds open pull requests waiting for review and issues opened in the last day.
If you turn on AI, it writes a short summary of the main themes.
The digest is posted to your #eng Slack channel before standup.
Before it runs live
- Connect GitHub
- Connect Slack, then invite the app to the channel (type /invite @ClickRuntime there)
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Change what the AI looks for, or how it writes the result
- Add another app, for example also send it to Google Sheets
- Combine it with other GitHub and Slack steps into one automation
Under the hood
The code that runs this automation
from datetime import date, timedelta
from clickruntime import on_trigger, credentials, http, notify, ai
def gh(method, path, **kw):
resp = http.request(method, f"https://api.github.com{path}", headers={
"Authorization": f"Bearer {credentials.connection('github', 'work')}", "Accept": "application/vnd.github+json"}, **kw)
return resp.raise_for_status() or (resp.json() if resp.content else None)
ORG = "acme"
def search(q):
return gh("GET", "/search/issues", params={"q": f"org:{ORG} {q}", "per_page": 30})["items"]
@on_trigger
def run(event):
since = date.today() - timedelta(days=1)
merged = search(f"is:pr is:merged merged:>={since}")
waiting = search("is:pr is:open draft:false review:required")
issues = search(f"is:issue created:>={since}")
fmt = lambda items: "\n".join(f"• <{i['html_url']}|{i['title']}>" for i in items[:10]) or "• none"
text = f"*Merged yesterday*\n{fmt(merged)}\n*Waiting for review*\n{fmt(waiting)}\n*New issues*\n{fmt(issues)}"
try:
titles = "\n".join(i["title"] for i in merged + issues)[:3000]
text = ai.generate(titles, system="Summarise the themes of this engineering work in two plain sentences.", max_output_tokens=120).text + "\n\n" + text
except (ai.AINotIncluded, ai.AILimitReached):
pass
notify.slack(text, channel="#eng")
return {"merged": len(merged), "waiting": len(waiting), "issues": len(issues)}FAQ
Common questions
Can it run before a specific meeting instead of every morning?
Which repositories are included?
Does it include draft pull requests?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Get Slack alerts for risky dependencies
Each day Slack lists new security alerts for packages and GitHub Actions used in your repositories, most severe first.
See how it worksBack up exports to GitHub each night
Every night your configuration or workflow exports are saved to a GitHub repository, and Slack lists exactly what changed.
See how it worksTrack flaky CI jobs in GitHub Actions
Each morning Slack lists the GitHub Actions workflows that failed and then passed on a re-run in the last week, so you know which tests are flaky.
See how it worksKeep exploring
Set up “Post a daily engineering digest from GitHub in Slack” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.