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.
- 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.
- 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.
- 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.xmland per repository social preview images.
| 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 |
- 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
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 --insightsThen start the frontend:
cd frontend
npm install
npm run dev # http://localhost:2326The API serves on http://localhost:8010, Postgres on 5433, Redis on 6380 (remapped to avoid common local conflicts).
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:2326Run 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 8010You still need a running Postgres and Redis, and the environment variables from infra/.env.example.
# 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# 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# on the host machine, not in Docker
ollama pull qwen2.5:7b
# the containers reach the host model automatically via host.docker.internalcd 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 -dMomentum 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.pygithub-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
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.
| 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 |
- 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
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
docker compose --env-file infra/.env.txt -f infra/docker-compose.yml up -d
# frontend: cd frontend && npm run devThe 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.
Two ways to keep the data fresh, pick one:
- Docker
beatcontainer (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), andtests(on push). Add the repository secrets each workflow reads, and it runs itself.
| 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 |
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.
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 -dSolution: 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.pySolution: 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.
Solution: In PowerShell, curl is an alias for Invoke-WebRequest. Use the real client instead:
curl.exe http://localhost:8010/healthSolution: 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.
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.
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- 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
Sagnik GitHub: @halcyon-vector
Found a bug or have a feature request? Open an issue on the repository.
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.