notification-hub

Operate the notification-hub API and web interface to manage notifications from GitHub, Slack, and Email sources.

7 stars

Best use case

notification-hub is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Operate the notification-hub API and web interface to manage notifications from GitHub, Slack, and Email sources.

Teams using notification-hub should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/notification-hub/SKILL.md --create-dirs "https://raw.githubusercontent.com/heldernoid/agentic-build-templates/main/projects/automation-productivity/notification-hub/skills/notification-hub/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/notification-hub/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How notification-hub Compares

Feature / Agentnotification-hubStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Operate the notification-hub API and web interface to manage notifications from GitHub, Slack, and Email sources.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# notification-hub skill

notification-hub is a unified notification aggregator. It ingests notifications from GitHub, Slack, and Email, normalises them into a single feed, and lets you filter, mute, label, archive, and digest them through a web UI and REST API.

## Environment

The server listens on `PORT` (default `3000`). Set these variables before running:

```
NOTIFICATION_HUB_PORT=3000
NOTIFICATION_HUB_DB=./data/notifications.db
NOTIFICATION_HUB_ENCRYPTION_KEY=<32-byte hex>   # AES-256-GCM key for OAuth token storage
NOTIFICATION_HUB_SESSION_SECRET=<random>
GITHUB_CLIENT_ID=<app client id>
GITHUB_CLIENT_SECRET=<app client secret>
GITHUB_CALLBACK_URL=http://localhost:3000/auth/github/callback
SLACK_CLIENT_ID=<app client id>
SLACK_CLIENT_SECRET=<app client secret>
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=alerts@example.com
SMTP_PASS=<password>
DIGEST_RECIPIENT=you@example.com
```

## Starting the server

```bash
pnpm install
pnpm dev          # development with hot reload
pnpm build && pnpm start   # production
```

Or with Docker:

```bash
docker compose up
```

## REST API

All routes are prefixed `/api`. Authenticate with the session cookie or the API token via `Authorization: Bearer <token>`.

### Feed

```bash
# List notifications (most recent first)
curl http://localhost:3000/api/notifications

# Filter by source, read status, priority
curl "http://localhost:3000/api/notifications?source=github&unread=1&priority=high"

# Full-text search
curl "http://localhost:3000/api/notifications?q=auth+middleware"

# Get a single notification
curl http://localhost:3000/api/notifications/:id

# Mark as read
curl -X PATCH http://localhost:3000/api/notifications/:id \
  -H 'Content-Type: application/json' \
  -d '{"read": true}'

# Set priority
curl -X PATCH http://localhost:3000/api/notifications/:id \
  -H 'Content-Type: application/json' \
  -d '{"priority": "high"}'

# Archive
curl -X POST http://localhost:3000/api/notifications/:id/archive

# Bulk mark read
curl -X POST http://localhost:3000/api/notifications/bulk \
  -H 'Content-Type: application/json' \
  -d '{"ids": ["id1","id2"], "action": "read"}'

# Bulk archive
curl -X POST http://localhost:3000/api/notifications/bulk \
  -H 'Content-Type: application/json' \
  -d '{"ids": ["id1","id2"], "action": "archive"}'
```

### Sources

```bash
# List connected sources
curl http://localhost:3000/api/sources

# Get source detail
curl http://localhost:3000/api/sources/:id

# Trigger manual sync
curl -X POST http://localhost:3000/api/sources/:id/sync

# Disconnect a source
curl -X DELETE http://localhost:3000/api/sources/:id

# Update watched repos (GitHub)
curl -X PATCH http://localhost:3000/api/sources/:id \
  -H 'Content-Type: application/json' \
  -d '{"config": {"repos": ["acme/api-gateway","acme/frontend"]}}'

# Update watched channels (Slack)
curl -X PATCH http://localhost:3000/api/sources/:id \
  -H 'Content-Type: application/json' \
  -d '{"config": {"channels": ["C012ABCDE","C999FGHIJ"]}}'
```

### Mute rules

```bash
# List rules
curl http://localhost:3000/api/mute-rules

# Create a rule
curl -X POST http://localhost:3000/api/mute-rules \
  -H 'Content-Type: application/json' \
  -d '{
    "pattern": "repo:acme/billing-api",
    "source": "github",
    "expiresAt": null
  }'

# Create a time-limited rule
curl -X POST http://localhost:3000/api/mute-rules \
  -H 'Content-Type: application/json' \
  -d '{
    "pattern": "title:chore*",
    "source": "github",
    "expiresAt": "2026-04-01T00:00:00Z"
  }'

# Enable / disable a rule
curl -X PATCH http://localhost:3000/api/mute-rules/:id \
  -H 'Content-Type: application/json' \
  -d '{"enabled": false}'

# Delete a rule
curl -X DELETE http://localhost:3000/api/mute-rules/:id
```

Supported pattern prefixes: `repo:`, `channel:`, `title:`, `from:`, `type:`. Use `*` as a wildcard.

### Digest

```bash
# Get digest config
curl http://localhost:3000/api/digest/config

# Update digest config
curl -X PATCH http://localhost:3000/api/digest/config \
  -H 'Content-Type: application/json' \
  -d '{"enabled": true, "deliveryTime": "08:00", "timezone": "UTC"}'

# Trigger an immediate digest
curl -X POST http://localhost:3000/api/digest/send

# List past digests
curl http://localhost:3000/api/digest/history
```

### Labels

```bash
# List labels
curl http://localhost:3000/api/labels

# Create a label
curl -X POST http://localhost:3000/api/labels \
  -H 'Content-Type: application/json' \
  -d '{"name": "incident", "color": "#dc2626"}'

# Apply a label to a notification
curl -X POST http://localhost:3000/api/notifications/:id/labels \
  -H 'Content-Type: application/json' \
  -d '{"labelId": "lbl_xyz"}'

# Remove a label
curl -X DELETE http://localhost:3000/api/notifications/:id/labels/:labelId
```

### Stats

```bash
# Get 30-day stats summary
curl http://localhost:3000/api/stats

# Get stats for a specific period
curl "http://localhost:3000/api/stats?from=2026-03-01&to=2026-03-31"
```

## Connecting GitHub

1. Go to Settings > Sources > Add Source > GitHub.
2. Click "Authorize with GitHub" to begin the OAuth2 flow (passport-github2).
3. After authorization, select the repositories to watch.
4. The OAuth access token is stored encrypted with AES-256-GCM using `NOTIFICATION_HUB_ENCRYPTION_KEY`.
5. GitHub notifications are polled every `SYNC_INTERVAL_MS` milliseconds (default 300000).

## Connecting Slack

1. Go to Settings > Sources > Add Source > Slack.
2. Enter your Slack Bot Token (`xoxb-...`). The token is validated immediately.
3. Select the channels to watch.
4. The bot token is stored encrypted at rest.
5. Messages are polled via the Slack Web API (`conversations.history`).

## Connecting Email (IMAP)

1. Go to Settings > Sources > Add Source > Email.
2. Enter your IMAP host, port, username, and password.
3. Credentials are stored encrypted at rest.

## Digest email

The daily digest is sent via nodemailer using the SMTP credentials in the environment. To test delivery without waiting for the scheduled time:

```bash
curl -X POST http://localhost:3000/api/digest/send
```

## API token rotation

```bash
curl -X POST http://localhost:3000/api/settings/api-token/rotate \
  -H 'Authorization: Bearer <current_token>'
```

Store the new token returned in the response. The old token is invalidated immediately.

Related Skills

notification-scheduler

7
from heldernoid/agentic-build-templates

Configure and manage scheduled dose reminders using node-cron and Web Notifications API. Use when building or debugging notification delivery in medication or health tracking apps.

Skill: Uptime Monitoring

7
from heldernoid/agentic-build-templates

## Overview

Skill: Status Page

7
from heldernoid/agentic-build-templates

## Overview

Skill: unit-conversion

7
from heldernoid/agentic-build-templates

## Overview

Skill: recipe-scaler

7
from heldernoid/agentic-build-templates

## Overview

reading-list

7
from heldernoid/agentic-build-templates

Operate the reading-list API to save, manage, tag, search, and export articles.

email-digest

7
from heldernoid/agentic-build-templates

Configure, test, and troubleshoot the reading-list daily email digest delivered via nodemailer.

websocket-realtime

7
from heldernoid/agentic-build-templates

Use the WebSocket connection in poll-builder to receive live vote updates. Use when you need to stream real-time poll results, monitor a poll for new votes, or build a live dashboard. Triggers include "live results", "real-time updates", "stream votes", "watch poll", or "WebSocket".

poll-builder

7
from heldernoid/agentic-build-templates

Self-hosted poll creation tool with real-time results. Use when you need to create a poll, check vote counts, close a poll, export results, or get the shareable link for a poll. Triggers include "create poll", "vote", "poll results", "survey", "collect votes", "share poll", or any task involving polling or voting.

Skill: personal-finance

7
from heldernoid/agentic-build-templates

## Overview

Skill: csv-import

7
from heldernoid/agentic-build-templates

## Overview

Skill: Syntax Highlighting

7
from heldernoid/agentic-build-templates

## Purpose