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

Problem

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

Solution

Built a topic-based pub/sub bot in Google Apps Script: teams browse topics and subscribe through interactive slash commands, set severity and platform filters, and get real-time, filtered notifications in their own Chat spaces.

Role

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

Impact

  • Self-service topic subscriptions with per-team severity/platform filters
  • Routes build, release, crash, and security events from 19+ pipelines
  • Replaced undifferentiated Jenkins spam with signal people opt into

Visual metaphor

A newsroom courier that only delivers the headlines you asked for.

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.