Never miss a good first issue again. Watches top open-source organizations on GitHub and delivers a clean email digest — every hour, automatically.
Most developers miss great open-source contribution opportunities because they don't constantly refresh GitHub. This tool fixes that.
- Polls GitHub API every hour for newly opened issues across selected orgs
- Skips PRs — issues only
- Sends one clean digest email per interval
- Stores seen issues in SQLite to prevent duplicate alerts
- Runs 24/7 on a cloud VM via Docker + GitHub Actions CI/CD
Monitored by default: supabase, python, digitalocean, pytorch, the-algorithms, freeCodeCamp — fully configurable.
- Designing long-running backend services
- Handling API rate limits in production systems
- Automating deployments using GitHub Actions self-hosted runners
- Managing containerized workloads on cloud infrastructure
GitHub API
│
▼
app.py (Python scheduler)
│ polls every N minutes
├──► SQLite DB (/data/notifier.db)
│ deduplication store
│
└──► Gmail SMTP
email digest to your inbox
Infrastructure:
- Runs inside Docker on an AWS EC2 Ubuntu VM
- Auto-deploys on every
git pushvia GitHub Actions self-hosted runner - Zero downtime redeploy with
docker compose up -d --build
| Layer | Tech |
|---|---|
| Language | Python 3.11 |
| Scheduling | Native Python (time.sleep loop) |
| Storage | SQLite via sqlite3 |
Gmail SMTP via smtplib |
|
| Containerization | Docker + Docker Compose |
| CI/CD | GitHub Actions (self-hosted runner on EC2) |
| Cloud | AWS EC2 (Ubuntu) |
git clone https://github.com/surya-pratap-singh-dev/github-oss-issue-notifier
cd github-oss-issue-notifier
cp .env.example .env
# fill in your values (see table below)
docker compose up --buildLogs will show:
Monitoring: supabase, python, digitalocean ...
No new issues found. # or
Digest sent with 4 issues.
| Variable | Required | Example | Source |
|---|---|---|---|
GITHUB_TOKEN |
Recommended | github_pat_xxx |
GitHub → Settings → Developer settings → PAT (read-only) |
GITHUB_ORGS |
Yes | supabase,python |
Org names from GitHub URLs |
CHECK_INTERVAL_MINUTES |
Yes | 60 |
Your preference |
STARTUP_LOOKBACK_HOURS |
Yes | 2 |
First-run lookback window |
GITHUB_PER_PAGE |
Yes | 100 |
Keep at 100 (GitHub max) |
SMTP_HOST |
Yes | smtp.gmail.com |
Fixed for Gmail |
SMTP_PORT |
Yes | 587 |
Fixed for Gmail TLS |
SMTP_USER |
Yes | you@gmail.com |
Your Gmail |
SMTP_PASS |
Yes | abcd efgh ijkl mnop |
Google Account → Security → App Passwords |
EMAIL_FROM |
Yes | you@gmail.com |
Same as SMTP_USER |
EMAIL_TO |
Yes | alerts@yourmail.com |
Destination (comma-sep for multiple) |
DB_PATH |
Yes | /data/notifier.db |
Keep default |
LOG_LEVEL |
Yes | INFO |
DEBUG for troubleshooting |
- Ubuntu EC2 instance (t2.micro free tier works)
- Docker + Docker Compose installed on VM
- Gmail with 2-Step Verification enabled
# SSH into your VM
ssh -i your-key.pem ubuntu@your-ec2-ip
# Clone the repo
git clone https://github.com/surya-pratap-singh-dev/github-oss-issue-notifier
cd github-oss-issue-notifier
# Create and fill .env
cp .env.example .env
nano .env
# Run
docker compose up -d --build
docker compose logs -fThis project uses a self-hosted GitHub Actions runner on the EC2 instance.
Every push to main:
- Triggers the runner on the VM
- Checks out latest code
- Validates Python syntax
- Rebuilds and restarts the Docker container
# .github/workflows/deploy.yml
on:
push:
branches: [main]
jobs:
deploy:
runs-on: self-hostedTo add the runner to your own VM: Settings → Actions → Runners → New self-hosted runner.
# Restart after config change
docker compose up -d --build
# Stop
docker compose down
# Check running container
docker ps
# View logs
docker compose logs -f- Logs show monitored org names on startup
- Every interval shows either
No new issues found.orDigest sent with X issues. - Check inbox (and spam) for subject:
[OSS Watch] X new GitHub issues (...)
- Set
GITHUB_TOKENwhen monitoring many orgs — unauthenticated rate limit is 60 req/hr - Wrong org names are skipped with a log error
- Never commit
.env— it's in.gitignore - Gmail requires App Password, not your account password
Migrated from a polling-based architecture to an event-driven system using GitHub Webhooks.
This enables instant detection of newly opened issues without relying on periodic API calls.
Benefits:
- Real-time notifications
- Reduced API usage
- More efficient system design
Integrated Redis as an in-memory data store for fast deduplication and caching of processed issues.
Benefits:
- Prevents duplicate alerts efficiently
- Reduces database load
- Improves overall system performance
Replaced traditional SMTP with scalable email services such as Amazon SES / SendGrid.
Features:
- HTML email templates
- Delivery tracking (open/click rates)
- Improved email reliability
Redesigned the system using AWS cloud services for better scalability and fault tolerance.
Components:
- Queue-based processing using SQS
- Serverless compute with Lambda
- Persistent storage using RDS / DynamoDB
Benefits:
- Handles traffic spikes
- Decoupled architecture
- High availability
Implemented user-defined filters to deliver highly relevant issue alerts.
Capabilities:
- Filter by labels (e.g.,
good first issue) - Language-based filtering
- Keyword-based matching
Future Scope:
- Machine learning-based recommendation system
Surya Pratap Singh — surya