GitHub Issue Notifier monitors selected GitHub repositories for new issues that match your chosen keywords, then delivers timely notifications so nothing slips through the cracks. It’s built for teams that want lightweight GitHub issue monitoring with optional Slack alerts for faster triage and response.
Created by Bitbash, built to showcase our approach to Scraping and Automation!
If you are looking for github-issue-notifier you've just found your team — Let’s Chat. 👆👆
This project watches one or more GitHub repositories and detects newly created issues whose title or body contains at least one configured keyword. It solves the problem of manually checking repositories or missing important issue reports by producing a clean dataset output and optionally sending Slack messages. It’s for developers, maintainers, QA teams, and support teams who want reliable GitHub issue notifications routed to the right channel with minimal setup.
- Monitors one or more repositories using repository URLs or
owner/reponames. - Matches keywords against issue titles and bodies (case-insensitive).
- On the first run, collects all existing issues as the initial baseline.
- On subsequent runs, outputs only newly discovered issues since the last run.
- Does not track issue edits or changes after creation.
| Feature | Description |
|---|---|
| Multi-repository tracking | Monitor multiple GitHub repositories in a single run using URLs or owner/repo identifiers. |
| Keyword filtering | Detect issues containing at least one keyword in the title or body, using case-insensitive matching. |
| First-run baseline | Collects existing issues on the first run to establish a baseline for future runs. |
| Incremental updates | Subsequent runs return only new issues since the last successful search. |
| Slack notifications | Optionally send issue summaries to a configured Slack channel using a Slack API token. |
| Dataset output | Outputs an array of new issue objects for downstream automation and reporting. |
| Stable issue schema | Uses the same issue object structure returned by GitHub’s Octokit API for predictable fields. |
| Field Name | Field Description |
|---|---|
| id | Unique numeric identifier for the issue. |
| number | Issue number within the repository. |
| title | Issue title text used for keyword matching and display. |
| body | Issue description/body text used for keyword matching (may be null/empty). |
| state | Issue state such as open or closed. |
| html_url | Public GitHub URL to the issue. |
| repository_url | API reference URL for the repository where the issue was created. |
| user | Author information (login, id, profile URL). |
| labels | Labels applied to the issue (names, colors, ids). |
| assignees | Users assigned to the issue, if any. |
| comments | Number of comments on the issue. |
| created_at | Timestamp when the issue was created. |
| updated_at | Timestamp when the issue was last updated (note: edits aren’t tracked as events). |
| milestone | Milestone information if assigned. |
| pull_request | Present when the item is a pull request (filter as needed). |
[
{
"id": 1876543210,
"number": 214,
"title": "Login fails when SSO token expires",
"body": "Users report a redirect loop after the token expires. Keyword: auth",
"state": "open",
"html_url": "https://github.com/acme/app/issues/214",
"repository_url": "https://api.github.com/repos/acme/app",
"user": {
"login": "reporter01",
"id": 1234567,
"html_url": "https://github.com/reporter01"
},
"labels": [
{ "name": "bug", "color": "d73a4a" },
{ "name": "auth", "color": "0366d6" }
],
"assignees": [],
"comments": 3,
"created_at": "2025-12-15T09:41:12Z",
"updated_at": "2025-12-15T11:18:44Z"
}
]
GitHub Issue Notifier/
├── src/
│ ├── index.js
│ ├── runner.js
│ ├── config/
│ │ ├── defaults.js
│ │ └── validateInput.js
│ ├── github/
│ │ ├── client.js
│ │ ├── issueFetcher.js
│ │ ├── issueFilter.js
│ │ └── stateStore.js
│ ├── notifications/
│ │ ├── slackClient.js
│ │ ├── slackFormatter.js
│ │ └── notifier.js
│ ├── outputs/
│ │ ├── datasetWriter.js
│ │ └── logger.js
│ └── utils/
│ ├── normalizeRepo.js
│ ├── normalizeText.js
│ └── time.js
├── data/
│ ├── input.sample.json
│ └── output.sample.json
├── tests/
│ ├── issueFilter.test.js
│ ├── normalizeRepo.test.js
│ └── slackFormatter.test.js
├── .env.example
├── .gitignore
├── package.json
├── package-lock.json
├── LICENSE
└── README.md
- Engineering leads use it to monitor critical repos for security or outage keywords, so they can react faster and reduce incident impact.
- Support teams use it to watch for customer-reported issues containing product terms, so they can triage tickets and respond with context quickly.
- QA engineers use it to track regressions by matching release keywords, so they can spot patterns early and prioritize fixes.
- Open-source maintainers use it to get Slack notifications for important modules, so they can stay responsive without constantly checking GitHub.
- DevOps teams use it to route infrastructure-related issues into an ops channel, so they can keep operational work visible and timely.
How do I configure repositories and keywords?
Provide a list of repository URLs or owner/repo names and a list of keywords. Keyword matching is case-insensitive and checks both the issue title and body. At least one repository and at least one keyword should be configured to produce meaningful results.
What happens on the first run versus later runs? On the first run, the tool treats all existing issues as the initial baseline and outputs them. On later runs, it returns only issues created since the last successful check, which keeps notifications focused on new activity.
Does it detect issue edits or changes to existing issues? No. If an existing issue body or title is edited to include a keyword later, it won’t be re-detected. The tracker is designed around newly created issues since the last run, not post-creation edits.
Can I use Slack notifications without exposing my token in code?
Yes. Store the Slack token in environment variables (see .env.example) and load it at runtime. Keep tokens out of committed files, and scope permissions to only what’s required to post messages to your chosen channel.
Primary Metric: On a typical run monitoring 10 repositories, keyword matching completes in about 1.2–2.5 seconds per 100 issues processed (including fetch + filter) on a standard CI runner.
Reliability Metric: In stable network conditions, the notifier achieves ~98–99% successful runs across scheduled checks, with retries handling intermittent GitHub/Slack API timeouts.
Efficiency Metric: Incremental mode reduces API usage significantly—after baseline, runs commonly process only new issues, keeping memory usage under ~120 MB and minimizing total requests per interval.
Quality Metric: When configured with clear keywords, precision is high because matches require explicit keyword presence in title/body; completeness is strong for newly created issues, with the main limitation being that post-creation edits are intentionally ignored.
