Notifications

Build results where your team already lives

Add a Slack incoming webhook to a channel and paste the URL into Settings → Notifications. Lastest posts a single message per build with the verdict, counts, and a deep link, and threads follow-ups (auto-fix, runner failure, baseline approval) under the original.

Try Lastest free →Read the docs

What you get

Three things this integration does - and what they mean for your team.

01

Incoming webhooks, no app install

Use Slack incoming webhooks. No Slack App, no admin install, no OAuth - just paste the URL, save, done. Add as many as you want for different channels.

02

Per-repo, per-status routing

Send blocked builds to #qa-alerts, safe-to-merge builds to #releases, and runner failures to #infra. Routes are per-repo so noisy projects do not pollute everyone.

03

Threaded follow-ups

Diff approval, auto-fix, baseline updates, and runner outage notifications post as threaded replies under the original build message - keeping the channel clean.

How it works

Data flow, configuration, and result routing - visualised.

Diagram 1 · Webhook flow

From build event to Slack message

Build completeeventNotification dispatchermatch routesSlack webhookincoming-hook#qa-alertsPOSTno Slack App · no admin install · no OAuth
Lastest finishes a build → emits a build.completed event → notification dispatcher matches routing rules → POSTs to the right Slack incoming webhook. No Slack OAuth required.

Diagram 2 · Routing rules

Right channel, right people

Build eventstatus + repo + labelstatus: blockedstatus: review_requiredstatus: safe_to_merge#qa-alerts#qa-review#releases
Match by repo, status, or label. Send blocked builds to #qa-alerts, safe-to-merge to #releases, and runner failures to #infra.

Diagram 3 · Threaded follow-ups

How follow-up events stay attached

Build #842 · review_requiredparent message↳ baseline approved by @ana↳ auto-fix attempted (3/3)↳ runner-3 disconnected · resumed↳ promoted to safe_to_mergeSlack thread ts=…stored on build rowts savedreply_broadcast=false
Lastest stores the Slack message ts on the build. Subsequent events (approval, auto-fix, runner outage) post as threaded replies to that ts.

Configure

Drop-in config for Slack

Sample Slack message Lastest posts on build completion

{
  "text": ":white_check_mark: *safe to merge*  `my-app`",
  "blocks": [
    { "type": "section", "text": { "type": "mrkdwn", "text": "*Build #842* - 8 passed · 0 review · 0 failed" } },
    { "type": "context", "elements": [ { "type": "mrkdwn", "text": "branch: `feat/checkout` · sha: `abc1234`" } ] },
    { "type": "actions", "elements": [ { "type": "button", "text": { "type": "plain_text", "text": "Open in Lastest" }, "url": "https://your-lastest/builds/842" } ] }
  ]
}

Frequently asked questions about Lastest + Slack

Do I need a Slack App?
No. Lastest uses incoming webhooks - paste the URL into Settings → Notifications. No admin install required.
Can different repos go to different channels?
Yes. Add one webhook per channel and use the routing UI to map repos and build statuses to channels.
Does Lastest dedupe noisy builds?
Yes. Build status updates within a single PR collapse into a single Slack thread; flapping flaky tests do not re-post.
What does the message look like?
Verdict (✅ safe-to-merge, ⚠️ review-required, 🚫 blocked), counts (passed / failed / review), deep link to the build, branch, and SHA.
Can I customize the message format?
Yes - use a Custom Webhook (see /integrations/webhooks) and POST your own Slack Block Kit payload to your relay.