How I Handle 200+ GitHub Notifications Without Losing My Mind
Last Tuesday, I had 247 unread GitHub notifications. By Wednesday afternoon, I'd missed a critical PR review that blocked my team for 6 hours. By Thursday, I'd decided enough was enough.
If you're a developer working on multiple repos, you know the pain: GitHub notifications pile up faster than you can triage them. Mix in Slack pings, email threads, and calendar alerts, and you're spending 2+ hours a day just staying on top of communication.
Here's how I went from drowning in notifications to processing 200+ GitHub items in under 30 minutes a day — and why I eventually built a unified inbox to solve this permanently.
The Problem: Death by Context Switching
My old workflow looked like this:
Morning routine (90 minutes):
- Open Mail.app → check email (15 min)
- Open Slack → respond to DMs, scan channels (25 min)
- Open GitHub notifications page → triage issues/PRs (35 min)
- Check calendar in yet another app (5 min)
- Realize I missed a Slack thread → back to Slack (10 min)
Result: By 10 AM, I'd already context-switched 12+ times and hadn't written a single line of code.
The real killer wasn't the volume of notifications — it was the cognitive overhead of switching between 3-4 apps just to understand what needed my attention.
What I Tried First
Attempt 1: GitHub email notifications
GitHub lets you receive all notifications via email. Sounds great, right?
Reality: My inbox became a graveyard of [user/repo] Issue #1234 emails. Threading broke constantly. Finding the original context meant opening GitHub anyway. Abandoned after 2 weeks.
Attempt 2: Slack integrations
Connected GitHub to Slack via webhooks. Every PR, issue comment, and mention posted to a #github channel.
Reality: The channel moved so fast I started muting it. Then I missed important mentions. Plus, I still had to check actual GitHub for the full thread. Abandoned after 1 week.
Attempt 3: Browser tabs + notifications
Kept GitHub, Slack, and Gmail pinned in Chrome tabs. Enabled desktop notifications for everything.
Reality: Notification fatigue set in. I started ignoring all notifications because most were noise. Battery life tanked (Chrome + Slack Desktop = 2-3 hours). Gave up after 3 weeks.
The Breaking Point
The moment I knew I needed a real solution: I got pinged in Slack about a PR that was blocking a deploy. The PR had been ready for review for 6 hours, but it was buried under 40 other GitHub notifications I hadn't triaged yet.
I'd spent the morning bouncing between email, Slack, and GitHub, yet somehow missed the most important thing.
That's when I realized: the problem wasn't the tools. It was the fragmentation.
What Actually Works: The Unified Inbox Approach
I started sketching out what a solution would look like:
Core principle: One window, one chronological feed, smart filtering.
Key features needed:
- Pull GitHub notifications, Slack DMs, and email into a single stream — no more app-hopping
- Filter by priority — separate "needs review" from "FYI"
- Preserve context — show the full thread without opening a browser
- Native Mac app — no Electron memory hog (looking at you, Slack Desktop)
- Privacy-first — all data stays on my machine
Why I Built It in SwiftUI
I tried Electron first. It worked, but:
- Memory usage: 1.2 GB for a basic prototype
- Battery drain: 30-40% per day just running in the background
- Startup time: 3-4 seconds cold launch
Switched to SwiftUI (native macOS):
- Memory usage: 50 MB (24x improvement)
- Battery drain: negligible (macOS optimizations for native apps)
- Startup time: instant (app icon bounce = ready)
For a tool I'd use 10+ hours a day, performance mattered.
The Technical Stack
Here's how I approached the GitHub notifications problem specifically:
GitHub API integration:
// Fetch all unread notifications
let notifications = try await github.notifications.list(all: false)
// Filter by reason (review_requested, mention, etc.)
let prioritized = notifications.filter {
["review_requested", "mention", "assign"].contains($0.reason)
}
// Group by repo for easy triage
let grouped = Dictionary(grouping: prioritized) { $0.repository.name }
Smart filtering rules:
- Priority 1: PRs I'm requested to review, direct @mentions
- Priority 2: Issues I'm assigned to, team mentions
- Priority 3: Thread subscriptions, repo watching
Key insight: GitHub's API exposes a reason field that tells you why you got the notification. Most third-party tools ignore this. Using it to auto-prioritize cut my triage time by 60%.
The Result
My current workflow (30 minutes):
- Open one app in the morning
- See GitHub PRs needing review, Slack DMs, and urgent emails in one unified feed
- Filter by "needs action" vs "FYI"
- Process high-priority items first
- Archive or snooze the rest
Time saved: 60 minutes/day = 5 hours/week = 20 hours/month.
The On-Device Privacy Win
One requirement I refused to compromise on: no cloud server processing my data.
Most "unified inbox" tools (Shift, Wavebox, etc.) are just Chromium wrappers that load the web UIs. They don't actually unify anything — you're still using Gmail's web UI, Slack's web UI, GitHub's web UI in separate tabs.
My approach:
- GitHub: Pull notifications via API, store locally in SQLite
- Slack: Use Slack API, decrypt messages on-device
- Email: IMAP connection, emails stored locally
Why this matters: My GitHub repos include proprietary code. Slack has customer conversations. Email has contracts. I'm not sending that to a third-party server just to get a unified feed.
What I'd Do Differently
If I were starting over:
- Start with MVP filtering logic — I spent 2 weeks on UI polish before nailing the smart filters. Should've been reversed.
- Test with 1000+ notifications immediately — My initial prototype choked on large volumes. Real-world testing would've caught this.
- Add keyboard shortcuts from day 1 — Power users (me) live in shortcuts. I bolted them on later; should've been core UX.
Should You Build Your Own?
Build it if:
- You're drowning in cross-app notifications daily
- You care about data privacy (no cloud processing)
- You want native performance (not Electron)
- You enjoy solving your own problems with code
Don't build it if:
- You're fine with browser tabs + discipline
- You don't mind Electron memory usage
- You need Windows/Linux support (SwiftUI = macOS only)
For me, this was a no-brainer. I'm a Mac developer who spends 10 hours/day in communication tools. Building a native unified inbox paid for itself in saved time within 2 weeks.
The Launch
I'm opening up early access on March 18, 2026 (7 days from now). If you're curious how it compares to Shift, Wavebox, or Rambox, I wrote up a detailed comparison here: heyrobyn.ai/compare
50% off for the first 50 signups. I built this to solve my own problem — if it helps you too, that's a win.
TL;DR:
- GitHub notifications + Slack + email = 2 hours/day lost to context switching
- Tried email routing, Slack integrations, browser tabs — all failed
- Built a native macOS unified inbox in SwiftUI (50 MB RAM vs 1.2 GB Electron)
- Used GitHub API's
reasonfield to auto-prioritize notifications - All data stays on-device (no cloud server)
- Cut triage time from 90 min → 30 min/day
If you're handling 100+ GitHub notifications weekly, this might resonate. If not, stick with your current setup — no shame in browser tabs if they work for you.
What's your notification triage workflow? Would love to hear what's working (or not working) for you.
Top comments (0)