Skip to content

CI/CD Tower

Morgans

A Google Chat bot that lets engineers self-subscribe to exactly the CI/CD and crash alerts they care about.

Google Apps ScriptGoogle Chat APIGoogle SheetsJenkins

30-second summary

Disclosure: Anonymized case study

Problem

Jenkins fired build notifications at everyone for everything — so people either drowned in the noise or muted the channel and missed what mattered.

Ownership

Designed and built the bot, topic model, interactive dialogs, filtering behavior, and Jenkins integration.

Key decision

Modeled alerts as self-service topic subscriptions with severity and platform filters instead of broadcasting every event to shared channels.

Result

  • Routes build, release, crash, and security events from 19+ pipelines.
  • Replaced undifferentiated Jenkins noise with filtered notifications teams opt into.

Trade-off

Used text-formatted notifications instead of cards so mobile previews show the information engineers need.

What I’d change now

Add digest mode for low-priority topics, richer actions inside notifications, and analytics on which topics drive action.

Highlights

Topic-based pub/sub
Interactive Chat dialogs
Per-topic filters

Context

Jenkins notifications had two settings: everything or nothing. Every project fired build alerts into shared channels, so people either drowned in noise from apps they didn't work on or muted the channel and missed the failures that mattered. Notification fatigue is just missed signal with extra steps.

Morgans fixes the routing, not the volume.

Approach

Morgans is a Google Chat bot built on Google Apps Script, backed by Google Sheets. The core idea is pub/sub, self-service:

  • Topics, not channels. Events are published to fine-grained topics — ci-cd, crash alerts, security scans, deployments — and teams subscribe to exactly what they care about.
  • Filters at the edge. A subscription can narrow by severity or platform, so an iOS team isn't paged for an Android warning.
  • Everything inside Chat. Discovery, subscribing, and filter config all happen through interactive slash commands — no separate web UI to maintain.

How it works

External services POST a JSON payload to the bot's endpoint. Morgans resolves who is subscribed to that topic, applies each subscription's filters, and delivers a text-formatted message (chosen over cards so mobile previews show real content). Slash commands — /topics, /subscribe, /list, /unsubscribe — open dialogs for browsing and managing subscriptions. Jenkins pipelines publish through small shared library steps.

Outcome

  • Self-service topic subscriptions with per-team severity and platform filters.
  • Routes build, release, crash, and security events from 19+ pipelines.
  • Turned undifferentiated Jenkins spam into signal people opt into — the notifications get read instead of muted.

What I'd build next

A digest mode for low-priority topics, richer interactive actions (retry a build, snooze an alert) directly from the notification, and analytics on which topics actually drive action.