AI-news-aggregator Bot is a Discord bot that watches AI labs, model registries, code hosts, social feeds, research sources, and rumor surfaces for new model activity โ then routes the good stuff into organized Discord channels.
It is built as a Node.js CommonJS app with:
- adaptive multi-source polling
- SQLite-backed state and observability
- optional hybrid classification with Groq
- event corroboration and source reliability scoring
- digest generation for breaking signals, papers, and weekly summaries
- optional GitHub webhook ingestion
- health/readiness endpoints for deployment monitoring
If you want a bot that acts less like a noisy RSS firehose and more like an AI release desk, this is the one.
The bot pulls signals from multiple source families, including:
- official lab/blog RSS feeds
- lab websites that need HTML scraping
- GitHub repositories and org activity
- Hugging Face organizations, trending models, and daily papers
- Reddit communities
- Bluesky accounts and newsletter feeds
- Ollama library updates
- ArXiv papers for weekly research digests
- LM Arena / leaderboard signals
- SDK registry changes
- API model registries and provider model catalogs
- changelogs and playground frontends that can leak new model IDs
- optional GitHub webhooks for near-real-time ingestion
- Organized Discord delivery: auto-creates an
๐ค AI Trackercategory with dedicated channels for releases, rumors, papers, leaderboards, health, and more. - Adaptive scheduling: sources speed up when they are hot and back off when they are quiet or unhealthy.
- Noise control: first-run seeding, URL/title similarity dedup, freshness gates, and relevance filtering keep alerts sane.
- Intelligence layer: observations are classified, linked into events, corroborated across sources, and scored for confidence.
- Source health tracking: failures, empty checks, latency, and backlog are recorded and surfaced.
- Operational readiness:
/live,/ready, and/healthendpoints make it deployable behind PM2 or Docker. - Weekly summaries: generates breaking signal digests, research paper digests, and weekly AI roundups.
At a high level, the runtime pipeline is:
src/index.jsbuilds adapter instances from the configured source lists.src/services/scheduler.jsruns them with adaptive timing and health-aware backoff.- Each adapter emits normalized items.
src/services/filter.jsclassifies items and records observations/events.src/services/notifier.jsenqueues delivery jobs, enriches/translates items when needed, and posts them to Discord.src/db/database.jspersists seen items, queue state, papers, events, health metrics, reliability scores, and webhook receipts.
The result: new signals land in Discord, not duplicate soup.
On startup, the bot ensures these text channels exist under an ๐ค AI Tracker category:
| Channel | Purpose |
|---|---|
๐ด-major-releases |
flagship launches, official releases, major upgrades |
๐ฆ-model-updates |
model/API/catalog changes that matter but are not top-tier launch alerts |
๐ฐ-tech-news |
broader AI and tech news |
๐ฌ-community-buzz |
forums, social chatter, open-source discussion |
๐-leaderboard-updates |
arena, benchmarks, leaderboard movement |
๐-research-papers |
weekly paper digest output |
๐-weekly-digest |
weekly news roundup |
๐ช-major-events |
event monitoring threads and recap signals |
๐ฎ-rumors-leaks |
lower-confidence or unverified early signals |
๐-china-ai |
China-focused AI coverage |
๐ง -talent-moves |
researcher and affiliation movement |
๐ค-bot-status |
operational updates and source health alerts |
| Command | What it does |
|---|---|
/status |
show uptime, bot status, and aggregate stats |
/sources |
list monitored sources and their status |
/health |
show source health and delivery queue backlog |
/latest |
show the most recent tracked items |
/timeline |
show recent confirmed events and top reliable sources |
/digest |
manually trigger digests |
/event start |
start an event monitoring mode |
/event stop |
stop an event monitoring mode |
/event list |
list active/recent event modes |
- Node.js 22+
- npm
- a Discord bot token and target guild/server ID
- optional: Reddit credentials, GitHub token, Groq key, provider API keys, webhook secret
If you are on Linux and building native modules locally, you may also need standard build tools for better-sqlite3.
npm installThis repository includes both .env.example and a placeholder .env.
Update .env with your real values before starting the bot.
Minimum required variables:
DISCORD_TOKEN=your_discord_bot_token_here
DISCORD_GUILD_ID=your_discord_server_id_hereRecommended additions:
REDDIT_CLIENT_ID+REDDIT_CLIENT_SECRETto enable Reddit monitoringGITHUB_TOKENto avoid the low unauthenticated GitHub rate limitGROQ_API_KEYif you enable the hybrid classifier
npm startFor local development with automatic restarts:
npm run devYou should see logs indicating that the bot:
- initialized the SQLite database
- logged into Discord
- created or resolved the tracker channels
- registered slash commands
- started the health server
- scheduled adapters and digests
The bot intentionally does not blast historical backlog into Discord on the first run for a source.
Instead, it seeds existing items into the database and only posts new, fresh, unseen items after startup. If the bot seems quiet for a while, that is probably it being polite rather than broken.
Items older than 24 hours are marked as seen without being sent as notifications.
| Variable | Purpose |
|---|---|
DISCORD_TOKEN |
Discord bot token |
DISCORD_GUILD_ID |
Discord server/guild ID to manage |
| Variable | Purpose |
|---|---|
REDDIT_CLIENT_ID / REDDIT_CLIENT_SECRET |
enable Reddit adapters |
REDDIT_USER_AGENT |
Reddit API user-agent string |
GITHUB_TOKEN |
higher GitHub API limits |
LOG_LEVEL |
runtime logging verbosity |
HEALTH_PORT |
port for /live, /ready, /health |
| Variable | Purpose |
|---|---|
CLASSIFIER_ENABLED |
enable Groq-assisted hybrid classification |
GROQ_API_KEY |
key used when classifier is enabled |
CLASSIFIER_MODEL |
Groq model name |
CLASSIFIER_TIMEOUT_MS, CLASSIFIER_MAX_RETRIES, CLASSIFIER_CACHE_TTL_SECONDS |
classifier behavior controls |
When classification is disabled or unavailable, the bot falls back to keyword-based filtering.
| Variable | Purpose |
|---|---|
WEBHOOK_ENABLED |
enable webhook receiver |
WEBHOOK_PORT |
webhook HTTP listener port |
GITHUB_WEBHOOK_SECRET |
required when webhooks are enabled |
WEBHOOK_MAX_BODY_BYTES |
max accepted payload size |
WEBHOOK_REQUEST_TIMEOUT_MS |
webhook request timeout |
| Variable | Purpose |
|---|---|
BROWSER_MODE |
set to local to enable Playwright-backed fallback scraping |
BROWSER_SNAPSHOTS_ENABLED |
enable browser snapshots for debugging/extraction workflows |
The bot can poll model catalogs directly when provider keys are set, including keys such as:
OPENROUTER_API_KEYOPENAI_API_KEYANTHROPIC_API_KEYGOOGLE_AI_API_KEYMISTRAL_API_KEYCOHERE_API_KEYXAI_API_KEYTOGETHER_API_KEYFIREWORKS_API_KEYPERPLEXITY_API_KEYCEREBRAS_API_KEYDEEPSEEK_API_KEYMOONSHOT_API_KEYYI_API_KEYSILICONFLOW_API_KEYZHIPU_API_KEYSTEPFUN_API_KEYBAICHUAN_API_KEYMINIMAX_API_KEYDASHSCOPE_API_KEY
Without these keys, the bot still works and falls back to free aggregators where possible.
The health server starts early during boot and exposes:
| Endpoint | Meaning |
|---|---|
/live |
process is up |
/ready |
bot is actually operational and startup checks passed |
/health |
full diagnostic snapshot |
By default the health server uses port 8788.
The digest service currently schedules:
- hourly breaking digest for recently confirmed signals
- weekly paper digest on Sundays at 10:00 AM (
Asia/Kolkata) - weekly major-events recap on Sundays at 10:10 AM (
Asia/Kolkata) - weekly roundup on Sundays at 10:15 AM (
Asia/Kolkata)
You can also trigger digests manually with /digest.
Persistent data lives in SQLite at:
data/tracker.db
The database stores, among other things:
- seen items and notification state
- source health and crawl attempts
- delivery queue and attempts
- papers and digests
- observations, corroborated events, and reliability scores
- event modes and webhook receipts
This repository includes Dockerfile and docker-compose.yml.
docker compose up --build -d- the SQLite data directory is mounted from
./data - the health endpoint is bound to loopback by default:
127.0.0.1:${HEALTH_PORT:-8788} - the container uses
restart: unless-stopped
Available scripts:
| Script | Purpose |
|---|---|
npm test |
run the automated test suite via Nodeโs built-in test runner |
npm run test:groq |
Groq smoke test |
npm run test:groq:eval |
Groq evaluation script |
- This project is written in CommonJS, not ESM.
- A GitHub token is optional, but strongly recommended for rate limits.
- Reddit monitoring is automatically disabled if Reddit credentials are missing.
- Webhook mode requires
WEBHOOK_ENABLED=trueand aGITHUB_WEBHOOK_SECRET. - Browser-backed scraping is optional and off by default.
- Update
.env - Run
npm install - Start with
npm run dev - Use
/status,/sources, and/healthin Discord to inspect runtime behavior - Watch
#๐ค-bot-statusfor health transitions and startup notices
This repository currently uses the license declared in package.json:
ISC