Examples / Daily engineering digest

Daily engineering digest

Every weekday at 9am, gather open pull requests and newly reported bugs, reshape them with a JavaScript step, and post a crisp summary to Slack.

GitHubSlackJavaScriptYour AI models

What you tell the assistant

Every weekday at 9am Toronto time, post a digest to #engineering with open PRs waiting on review and bugs opened in the last day in northwind/api.

Why it works

  • A sandboxed JavaScript step groups and counts results — no model tokens spent on arithmetic.
  • Schedules run in your timezone.
  • The fast model writes the summary, keeping the run cheap.
Build this workflow

What it builds

Trigger
Schedule
0 9 * * 1-5 · America/Toronto
tool
Open pull requests
github.list_pull_requests
tool
New bugs
github.search_issues
javascript
Group and count
→ waiting, drafts, bug_count
llm
Write the digest
fast
tool
Post to #engineering
slack.post_message
View the definition
trigger:
  kind: schedule
  cron: "0 9 * * 1-5"
  timezone: America/Toronto
steps:
  - key: prs
    name: Open pull requests
    kind: tool
    tool: github.list_pull_requests
    args: { repo: northwind/api, state: open, limit: 50 }
  - key: bugs
    name: New bugs
    kind: tool
    tool: github.search_issues
    args: { query: "repo:northwind/api is:issue is:open label:bug created:>={{ run.started_at }}", limit: 50 }
  - key: shape
    name: Group and count
    kind: javascript
    inputs: { prs: "{{ steps.prs.output }}", bugs: "{{ steps.bugs.output }}" }
    outputs: { waiting: array, drafts: integer, bug_count: integer }
    code: |
      function main({ prs, bugs }) {
        const waiting = prs.filter(pr => !pr.draft).map(pr => `#${pr.number} ${pr.title} (@${pr.author})`)
        console.log(`${waiting.length} ready for review, ${bugs.length} new bugs`)
        return { waiting, drafts: prs.length - waiting.length, bug_count: bugs.length }
      }
  - key: write
    name: Write the digest
    kind: llm
    model: fast
    prompt: |
      Write a short, friendly Slack digest for the engineering team.
      Ready for review: {{ steps.shape.output.waiting }}
      Drafts: {{ steps.shape.output.drafts }}. New bugs: {{ steps.bugs.output }}
  - key: post
    name: "Post to #engineering"
    kind: tool
    tool: slack.post_message
    args: { channel: C01ENGINEER, text: "{{ steps.write.output.text }}" }

A sample run

What each step produces

Open pull requests tool

succeeded
Calling github.list_pull_requests
[
  {
    "number": 1482,
    "title": "Backfill invoice currency",
    "author": "sokafor",
    "draft": false
  },
  {
    "number": 1479,
    "title": "Cache plan lookups",
    "author": "pramen",
    "draft": false
  },
  {
    "number": 1476,
    "title": "Experiment: new pricing page",
    "author": "lmartins",
    "draft": true
  }
]

New bugs tool

succeeded
Calling github.search_issues
[
  {
    "number": 1485,
    "title": "CSV export times out for large accounts",
    "author": "mchen"
  },
  {
    "number": 1484,
    "title": "Webhook retries duplicate invoices",
    "author": "sokafor"
  }
]

Group and count javascript

succeeded
2 ready for review, 2 new bugs
{
  "waiting": [
    "#1482 Backfill invoice currency (@sokafor)",
    "#1479 Cache plan lookups (@pramen)"
  ],
  "drafts": 1,
  "bug_count": 2
}

Write the digest llm

succeeded
Using model fast (Claude Haiku 4.5, Murmurator AI)
{
  "text": "Good morning! :sunny: *2 PRs are ready for review*: #1482 Backfill invoice currency, #1479 Cache plan lookups. 1 draft in progress. *2 new bugs* came in — the CSV export timeout looks customer-facing."
}

Post to #engineering tool

succeeded
Calling slack.post_message
{
  "channel": "C01ENGINEER",
  "ts": "1758632400.000200"
}

Trigger payload

{
  "scheduled_at": "2026-09-23T13:00:00Z"
}

Your next automation is one sentence away.

14-day free trial with $5 of built-in AI included. Cancel anytime.