Skip to content

HalcyonVector/GitHub-Trending-Intelligence-

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GitHub Trending Intelligence

A Bloomberg terminal for open source. It ingests trending GitHub repositories every few hours, scores them by velocity rather than raw star counts, groups them into technology categories, and writes an AI analysis for the fastest risers. Built as a Next.js dashboard on a FastAPI and Celery backend, with a local free AI model and free browser push alerts. No paid services are required to run it.


Features

Core Features

  • Momentum scoring A single 0 to 100 score per repository, blending star, fork, contributor, and commit velocity, with a recency bonus for new projects. This one number drives every leaderboard and ranking.
  • Live leaderboards Hottest today and rising this week, ranked by star velocity with inline 7 day sparklines.
  • Category momentum Fifteen technology categories (AI agents, MCP servers, LLM inference, vector databases, and more) ranked by composite momentum with week over week deltas.
  • Technology radar A polar view of every category split into rising, stable, and declining, with the 65 point breakout line marked.
  • Language rankings Every programming language ranked by the average momentum of its repositories.
  • AI analyst Each repository page carries a written breakdown (why it is growing, what it solves, who uses it, a verdict, and competitors), generated by a local Ollama model by default or a hosted LLM (Groq, OpenAI compatible, or Claude).
  • Watchlist and push alerts A private, browser local watchlist with optional Web Push notifications when a watched repository crosses your momentum threshold, even with the tab closed.
  • Compare Line up to four repositories side by side with a metrics table and an overlaid star growth chart.
  • Full text search Sub 50 millisecond search across every tracked repository, backed by PostgreSQL full text search.
  • Command palette Ctrl or Cmd + K for instant repository lookup, page navigation, recent repositories, and theme toggle.
  • Hype vs substance signal Every repository is flagged as backed by activity or star driven, so a spike that is real contributor and commit growth is distinguished from one that is only stars.
  • Data freshness Each view shows when its underlying data was last synced, so you always know how current the numbers are.
  • Weekly digest A scheduled recap of the week's breakouts and top movers, delivered to email (Resend), Slack, and Discord. Every channel is optional and independently configured.

App Sections

  • Dashboard The big story, leaderboards, category momentum grid, new entrants, and AI ecosystem feed.
  • This Week An editorial weekly recap: biggest movers, new entrants, and categories heating up or cooling down.
  • Trends Category rankings with momentum and week over week change.
  • Category detail Momentum over time, radar status, and the top repositories in a category.
  • Radar Polar momentum chart plus rising, stable, and declining rails.
  • Languages Momentum ranked by programming language.
  • Repositories The full index with sort, language filter, and pagination.
  • Repository detail Metrics, star growth and velocity charts, and the AI analyst panel.
  • Compare Head to head analysis for two to four repositories.
  • Watchlist Your saved repositories plus background alerts.
  • Dashboard search Full text search lives inline on the dashboard as a compact bar, with the command palette (Ctrl or Cmd + K) for keyboard driven lookup.

Data Coverage

  • Time series Daily and weekly metrics per repository, star growth curves, momentum history.
  • Context Category classification, language, topics, license, and creation date.
  • Aggregates Category snapshots, language rollups, radar status.
  • Discovery New entrants, AI ecosystem feed, competitor suggestions.
  • Feeds RSS feed at /rss.xml and per repository social preview images.

Tech Stack

Component Technology Details
Frontend Next.js 15, React 19 App Router, server components, TanStack Query for data
Styling CSS design system Editorial theme with a Dusk and Paper toggle; no UI framework
Charts Inline SVG Dependency free sparklines, area, bar, and radar charts
Backend FastAPI, Python 3.12 Async REST API, cursor based pagination
Database PostgreSQL, SQLAlchemy async Repositories, metrics, categories, insights, push subscriptions
Cache and queue Redis Response cache and the Celery message broker
Workers Celery Scheduled ingestion, scoring, aggregation, and insight jobs
AI Ollama (default), Groq or OpenAI compatible, Claude (optional) Local model by default; point AI_PROVIDER at a free hosted LLM (Groq) or Claude with one env var
Push Web Push, VAPID, pywebpush Free browser push, no third party service
Notifications Resend email, Slack, Discord webhooks Outbound digest and alert channels, each optional
Automation GitHub Actions Serverless refresh, weekly digest, and keep warm on a schedule, no always on worker required
External data GitHub REST API Authenticated ingestion at 5,000 requests per hour

Prerequisites

  • Docker Desktop running (the backend stack runs in containers)
  • Node.js 18+ for the frontend (Download here)
  • A GitHub personal access token for ingestion (Create one here; no scopes needed for public data)
  • Ollama for the AI analysis, optional (Download here); pull a model with ollama pull qwen2.5:7b

Quick Start (3 Options)

Option 1: Full Stack with Docker (Recommended)

Bring up Postgres, Redis, the API, and the workers, then load a first batch of data:

# fill in your GitHub token in infra/.env.txt, then from the project root
docker compose --env-file infra/.env.txt -f infra/docker-compose.yml up -d
docker compose --env-file infra/.env.txt -f infra/docker-compose.yml exec -e PYTHONPATH=/app api python scripts/refresh.py --insights

Then start the frontend:

cd frontend
npm install
npm run dev   # http://localhost:2326

The API serves on http://localhost:8010, Postgres on 5433, Redis on 6380 (remapped to avoid common local conflicts).

Option 2: Frontend Only (Against a Running Backend)

If the backend is already running (locally or hosted), point the frontend at it and start it alone:

cd frontend
echo NEXT_PUBLIC_API_URL=http://localhost:8010 > .env.local
npm install
npm run dev   # http://localhost:2326

Option 3: Local Backend without Docker

Run the backend directly with Python 3.12 (Python 3.14 lacks wheels for some dependencies):

cd backend
py -3.12 -m venv .venv
.venv\Scripts\activate          # macOS or Linux: source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8010

You still need a running Postgres and Redis, and the environment variables from infra/.env.example.


Detailed Setup Instructions

Windows

# 1. Clone the repository
git clone https://github.com/halcyon-vector/github-trending-intelligence.git
cd github-trending-intelligence

# 2. Create your env file from the example and fill in GITHUB_TOKEN
copy infra\.env.example infra\.env.txt
#    (edit infra\.env.txt: set GITHUB_TOKEN, and optionally VAPID keys and AI settings)

# 3. Start the backend stack
docker compose --env-file infra/.env.txt -f infra/docker-compose.yml up -d

# 4. Load a first batch of data (add --insights to also run the AI analyst)
docker compose --env-file infra/.env.txt -f infra/docker-compose.yml exec -e PYTHONPATH=/app api python scripts/refresh.py --insights

# 5. Start the frontend
cd frontend
npm install
npm run dev   # double-check http://localhost:2326

macOS / Linux

# 1. Clone the repository
git clone https://github.com/halcyon-vector/github-trending-intelligence.git
cd github-trending-intelligence

# 2. Create your env file and fill in GITHUB_TOKEN
cp infra/.env.example infra/.env.txt

# 3. Start the backend stack
docker compose --env-file infra/.env.txt -f infra/docker-compose.yml up -d

# 4. Load a first batch of data
docker compose --env-file infra/.env.txt -f infra/docker-compose.yml exec -e PYTHONPATH=/app api python scripts/refresh.py --insights

# 5. Start the frontend
cd frontend && npm install && npm run dev

Enabling AI Insights (Ollama)

# on the host machine, not in Docker
ollama pull qwen2.5:7b
# the containers reach the host model automatically via host.docker.internal

Enabling Browser Push (optional)

cd backend && python scripts/generate_vapid.py
# paste the printed VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, and VAPID_SUBJECT into infra/.env.txt
# then recreate: docker compose --env-file infra/.env.txt -f infra/docker-compose.yml up -d

Seeing Live Momentum Immediately (optional)

Momentum measures change, so a fresh database reads zero until a second daily snapshot exists. To bootstrap it without waiting:

docker compose --env-file infra/.env.txt -f infra/docker-compose.yml exec -e PYTHONPATH=/app api python scripts/seed_demo.py

Project Structure

github-trending-intelligence/
├── README.md                       # This file
├── render.yaml                     # Render Blueprint for the free tier API
├── .github/
│   └── workflows/                  # refresh (every 6h), weekly-digest, keep-warm, tests
│
├── docs/
│   ├── ARCHITECTURE.md             # System design and PRD
│   ├── DEPLOY-FREE.md              # Free hosting walkthrough (Vercel, Supabase, Render, Groq)
│   └── NOTIFICATIONS.md            # Email, Slack, and Discord channel setup
│
├── infra/
│   ├── docker-compose.yml          # postgres, redis, api, worker, beat
│   ├── schema.sql                  # Postgres schema and category seed data
│   └── .env.example                # copy to infra/.env.txt and fill in
│
├── backend/
│   ├── Dockerfile                  # Python 3.12 image
│   ├── requirements.txt
│   ├── pytest.ini                  # test configuration
│   ├── conftest.py                 # test env bootstrap
│   ├── scripts/
│   │   ├── refresh.py              # manual ingest, score, aggregate, insights
│   │   ├── seed_demo.py            # synthetic prior day snapshot for instant momentum
│   │   ├── send_digest.py          # build and send the weekly digest
│   │   └── generate_vapid.py       # generate a Web Push VAPID keypair
│   ├── tests/
│   │   ├── test_momentum.py        # momentum algorithm
│   │   ├── test_github_service.py  # GitHub response parsing
│   │   └── test_ai_service.py      # AI insight coercion
│   └── app/
│       ├── main.py                 # FastAPI app and router wiring
│       ├── core/                   # config, database, cache
│       ├── models/                 # SQLAlchemy models
│       ├── schemas/                # Pydantic response models
│       ├── api/v1/                 # dashboard, repositories, trends, search, push, analytics
│       ├── services/               # github, ai (ollama or claude), trend, push
│       └── workers/
│           └── ingestion.py        # Celery tasks and beat schedule
│
└── frontend/
    ├── package.json
    ├── next.config.ts
    ├── tailwind.config.ts
    ├── vitest.config.ts
    ├── public/
    │   └── sw.js                   # service worker for Web Push
    └── src/
        ├── app/                    # routes: /, this-week, trends, trends/[slug],
        │                           #   radar, languages, repositories, repos/[id],
        │                           #   compare, watchlist, search, rss.xml
        ├── components/             # per page clients and shared components
        ├── hooks/                  # useWatchlist, useSparklines
        └── lib/                    # api, types, utils, chart, push, watchlist, recent

Data and Methodology

Source

All data is fetched from the GitHub REST API using an authenticated personal access token, which allows 5,000 requests per hour. Only public repository metadata is read. With the default local Ollama model, AI analysis is generated on your machine and no repository content leaves it; if you switch to a hosted provider (Groq, OpenAI compatible, or Claude) the repository metadata used for the analysis is sent to that provider.

Categories Tracked

Category Focus
AI and agents AI agents, MCP servers, LLM frameworks, coding assistants
ML infrastructure Vector databases, inference, training, serving
Application Frontend frameworks, backend frameworks, databases
Platform Developer tools, infrastructure, security
Data Data engineering, observability, fintech

Metrics Calculated

  • Velocity Stars gained per day and per week, forks gained, new contributors, commit activity
  • Momentum A 0 to 100 composite: star velocity 45 percent, fork velocity 20 percent, contributor velocity 20 percent, commit activity 10 percent, issue activity 5 percent, with a 1.2x bonus for repositories under 30 days old
  • Category rollups Momentum averaged across a category, plus rising, stable, or declining status
  • Language rollups Average momentum and total velocity per programming language

Ingestion Pipeline

GitHub REST API
    ↓
ingest_trending_repos  (every 6 hours) writes a daily metrics snapshot
    ↓
compute_trend_scores   (every 6 hours) computes daily gains and momentum, fires push alerts
    ↓
aggregate_snapshots    (daily) rolls repositories into category snapshots
    ↓
generate_ai_insights   (daily) writes AI analysis for the top repositories via Ollama
    ↓
FastAPI serves cached JSON, the Next.js dashboard renders it

Deployment

Local (Free)

docker compose --env-file infra/.env.txt -f infra/docker-compose.yml up -d
# frontend: cd frontend && npm run dev

Cloud

The stack is designed for managed hosting:

Piece Suggested host Notes
Frontend Vercel Free tier, provides HTTPS which Web Push requires
Database Supabase or Neon Free Postgres tier
Cache Upstash Free Redis tier
API Render (free tier, render.yaml blueprint), Fly.io, or a small VPS The included render.yaml deploys the API in one click
Scheduler GitHub Actions Replaces the always on beat container, so no worker needs to stay running (see below)
AI AI_PROVIDER=groq with a free Groq API key, any OpenAI compatible endpoint, or AI_PROVIDER=off Groq's free tier runs a hosted 70B model with no card; free hosts cannot run a local model

Set NEXT_PUBLIC_API_URL on the frontend to the hosted API, and replace the local Postgres and Redis URLs with the managed ones through environment variables. A full free hosting walkthrough lives in docs/DEPLOY-FREE.md, and channel setup in docs/NOTIFICATIONS.md.

Scheduled Jobs

Two ways to keep the data fresh, pick one:

  • Docker beat container (self hosted) triggers ingestion every 6 hours, scoring 30 minutes later, and aggregation plus AI insights daily. As long as the containers keep running, the data refreshes on its own.
  • GitHub Actions (serverless, free on public repos) runs the same pipeline without any always on process. The included workflows are refresh (full pipeline every 6 hours), weekly-digest (Mondays 09:00 UTC), keep-warm (pings the free Render API every 10 minutes so it does not cold start), and tests (on push). Add the repository secrets each workflow reads, and it runs itself.

Available Scripts

Script Command Description
Start the stack docker compose --env-file infra/.env.txt -f infra/docker-compose.yml up -d Bring up Postgres, Redis, API, worker, beat
Load and score data ... exec -e PYTHONPATH=/app api python scripts/refresh.py --insights Ingest, compute scores, aggregate, generate insights
Seed live momentum ... exec -e PYTHONPATH=/app api python scripts/seed_demo.py Insert a synthetic prior day snapshot so momentum shows immediately
Generate VAPID keys cd backend && python scripts/generate_vapid.py Create a keypair for browser push
Send weekly digest cd backend && python scripts/send_digest.py Build and send the digest to configured channels (email, Slack, Discord)
Backend tests ... exec -e PYTHONPATH=/app api python -m pytest -q Run the pytest suite
Frontend tests cd frontend && npm test Run the vitest suite
Frontend build cd frontend && npm run build Production build

Troubleshooting

Issue: Bind for 0.0.0.0:PORT failed: port is already allocated

Solution: Another app owns that port. Postgres, Redis, and the API are already remapped to 5433, 6380, and 8010. Find the culprit with netstat -ano | findstr :PORT, or change the host port in infra/docker-compose.yml.

Issue: The "GITHUB_TOKEN" variable is not set. Defaulting to a blank string.

Solution: Docker Compose is not reading your env file. Always pass it explicitly:

docker compose --env-file infra/.env.txt -f infra/docker-compose.yml up -d

Issue: ModuleNotFoundError: No module named 'app' when running a script

Solution: Set the path so the package resolves:

docker compose --env-file infra/.env.txt -f infra/docker-compose.yml exec -e PYTHONPATH=/app api python scripts/refresh.py

Issue: Failed building wheel for pydantic-core (or asyncpg, orjson)

Solution: You are likely on Python 3.14, which lacks prebuilt wheels. The backend runs in Docker on Python 3.12, so use Docker, or create a local venv with py -3.12.

Issue: PowerShell curl prompts about script execution

Solution: In PowerShell, curl is an alias for Invoke-WebRequest. Use the real client instead:

curl.exe http://localhost:8010/health

Issue: AI insights do not generate

Solution: Confirm Ollama is running and the model is pulled. From the host, curl.exe http://localhost:11434/api/tags should list the model. Viewing existing insights does not need Ollama; only generating new ones does.

Issue: Momentum and leaderboards read zero on a fresh database

Solution: Momentum measures change and needs a second daily snapshot. Wait for the next 6 hour cycle, or run scripts/seed_demo.py to bootstrap it immediately.

Issue: Postgres exits on first start

Solution: A half initialized volume from an aborted run. Reset it (this wipes the database):

docker compose --env-file infra/.env.txt -f infra/docker-compose.yml down -v
docker compose --env-file infra/.env.txt -f infra/docker-compose.yml up -d

Future Enhancements

  • Free tier hosted LLM provider so cloud AI stays free (Groq / OpenAI compatible)
  • Weekly email digest (email, Slack, and Discord)
  • User accounts with server side watchlists and a personalized feed
  • Progressive web app install and SEO (sitemap, robots, social images)
  • Similar repositories on detail pages
  • Contributor growth charts
  • Real time updates over websockets
  • Historical backfill so momentum is live from day one

Author

Sagnik GitHub: @halcyon-vector


Support

Found a bug or have a feature request? Open an issue on the repository.


License and Attribution

Data Attribution: Repository data is fetched from the GitHub REST API under GitHub's terms of service. With the default local model, AI analysis runs on your machine; if you enable a hosted provider, repository metadata is sent to that provider for analysis.

Project License: Released under the MIT License.


About

Velocity-scored GitHub trending tracker, FastAPI + Celery compute a 0–100 momentum score per repo, served to a Next.js dashboard with local/Groq AI analysis and a weekly email digest.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages