Notification Hub

Unified notification hub collecting all skill alerts and delivering by priority

Audits

Pass

Install

openclaw skills install mupeng-notification-hub

notification-hub

Notification Integration — Collects all skill notifications centrally and delivers by priority to reduce notification fatigue.

🎯 Purpose

Centrally manage diverse notifications from all skills and deliver at appropriate timing and channels based on importance.

📥 Notification Sources

Collect all event files from events/ directory:

events/
  ├── health-2026-02-14.json         (health-monitor)
  ├── scrape-result-2026-02-14.json  (data-scraper)
  ├── dm-check-2026-02-14.json       (insta-post)
  ├── competitor-2026-02-14.json     (competitor-watch)
  └── workflow-2026-02-14.json       (skill-composer)

🚦 Priority Filtering

1. urgent — Immediate Discord DM

Conditions:

  • Security issues (abnormal login, suspicious access)
  • System errors (OpenClaw down, browser disconnected)
  • Cost exceeded (API usage 90%+)
  • Critical mentions

Delivery:

  • Discord DM (channel ID configured in TOOLS.md)
  • Send immediately (within 1 min)

Example:

🚨 Urgent: Browser disconnected
Port 18800 not responding. Auto-recovery attempted but failed.
Manual check needed: openclaw browser start

2. important — Include in next heartbeat

Conditions:

  • New Instagram DMs (unread)
  • Trending keyword surge detected
  • Competitor launches new service
  • Git push needed (10+ unpushed commits)

Delivery:

  • Include in next heartbeat response (~30 min intervals)
  • Bundle multiple notifications in single message

Example:

📢 3 Updates

📩 2 Instagram DMs (iam.dawn.kim, partner_xyz)
📈 Trend: "AI agent" surging (+150%)
🔄 Git: 12 commits waiting for push

3. info — Include in daily-report only

Conditions:

  • Regular statistics updates
  • Daily token usage
  • Completed workflows
  • General system logs

Delivery:

  • Include when daily-report skill executes
  • Send summary once daily

Example:

📊 Daily Report (2026-02-14)

✅ 3 workflows completed
📊 Tokens: 45,230 / 100,000 (45%)
📝 Memory: 3.2 GB
🔧 Health check: OK

🔕 Duplicate Prevention

Never send notification more than once for same event.

Duplicate Detection

{
  "event_id": "health-check-2026-02-14-07:00",
  "fingerprint": "sha256(source + type + key_data)",
  "notified_at": "2026-02-14T07:05:00+09:00"
}

History Storage

memory/notifications/
  ├── sent-2026-02-14.json
  ├── sent-2026-02-13.json
  └── ...

sent-YYYY-MM-DD.json structure:

{
  "date": "2026-02-14",
  "notifications": [
    {
      "id": "health-check-2026-02-14-07:00",
      "priority": "info",
      "sent_at": "2026-02-14T07:05:00+09:00",
      "channel": "discord_dm",
      "source": "health-monitor"
    }
  ]
}

📢 Delivery Channels

Discord DM

  • Channel ID: Configure in TOOLS.md
  • Purpose: urgent, important notifications
  • Format: Markdown (emoji + title + content)

Heartbeat Response

  • Purpose: Bundle important notifications
  • Format: Concise bullet list

Daily Report

  • Purpose: info notification summary
  • Format: Structured section organization

🎤 Triggers

Activate skill with these keywords:

  • "notification settings"
  • "notification"
  • "check notifications"
  • "anything new"

🚀 Usage Examples

Check Notifications

"Anything new?"
→ Immediately summarize important+ notifications

Notification Settings

"Set Instagram DMs to immediate notification"
→ Promote dm-check events to urgent

Notification History

"Show today's notification history"
→ Read memory/notifications/sent-2026-02-14.json

⚙️ Implementation Guide

1. Collect Events

// Scan events/ directory
const events = fs.readdirSync('events/')
  .filter(f => f.endsWith('.json'))
  .map(f => JSON.parse(fs.readFileSync(`events/${f}`)));

2. Classify by Priority

const urgent = events.filter(e => e.priority === 'urgent');
const important = events.filter(e => e.priority === 'important');
const info = events.filter(e => e.priority === 'info');

3. Duplicate Check

const sent = loadSentHistory(today);
const newEvents = events.filter(e => 
  !sent.notifications.some(n => n.id === e.id)
);

4. Deliver

// urgent → Immediate Discord DM
if (urgent.length > 0) {
  await sendDiscordDM(urgent);
}

// important → Add to heartbeat queue
if (important.length > 0) {
  await addToHeartbeatQueue(important);
}

// info → Add to daily-report queue
if (info.length > 0) {
  await addToDailyReportQueue(info);
}

5. Save History

saveSentHistory(today, newlySentNotifications);

📊 Event Priority Guide

Guide each skill to include priority field when creating events:

{
  "timestamp": "2026-02-14T07:58:00+09:00",
  "skill": "health-monitor",
  "priority": "urgent",  // urgent | important | info
  "message": "Browser disconnected",
  "data": { ... }
}

🐧 Built by 무펭이Mupengism ecosystem skill