Daily pull-request radar for inference-infra repos (FlashInfer, SGLang, vLLM,
FlashMLA, …). A worker polls GitHub for newly opened and merged PRs, drops
noise (docs/CI/typos) with a rule pass, tags the rest into categories — with a
Together LLM when TOGETHER_API_KEY is set, rule heuristics otherwise — and a
React UI shows a per-day digest.
Same architectural shape as eval-api / eval.together-turbo.com so it can be
productionized the same way: Caddy serves the static Vite bundle and proxies
/v1/*, /admin/*, /health same-origin to FastAPI; a worker runs alongside;
storage is a thin DAO (api/app/store.py) over SQLite that swaps to
Mongo/DocumentDB by reimplementing one module.
api/app/config.py— watched repos, categories, env settingsapi/app/github.py— pulls API client (newest-first, stops at cutoff)api/app/rules.py— high-precision noise drop + category hintsapi/app/llm.py— batched Together chat-completions classificationapi/app/pipeline.py— fetch → rules → LLM → upsert, incremental per-repo syncapi/app/main.py— FastAPI:/v1/prs,/v1/digest,/admin/v1/ingestapi/app/worker.py—--onceor polling loop (DIGEST_POLL_INTERVAL_HOURS)web/— Vite + React + TS + Tailwind + React Query SPA (Digest / Browse views)deploy/Caddyfile,docker-compose.yml— prod-shaped local stack
make setup # npm install
make ingest # one-shot sync (LOOKBACK=7 to widen)
make api # FastAPI :8123
make web # Vite :5173, proxies /v1 -> :8123make up # builds web/dist, then caddy :8080 -> api + worker
make downCopy .env.example to .env (compose reads it automatically). Without
GITHUB_TOKEN, local dev falls back to gh auth token; without
TOGETHER_API_KEY, classification is rules-only (no summaries, coarser tags).
Re-tagging after enabling the LLM: make ingest LOOKBACK=3 reclassifies the
window (existing rule-tagged rows are overwritten by the LLM verdicts only for
PRs still inside it).
- EC2 box (or any host) with Docker:
docker compose up -das-is; changedeploy/Caddyfile:80to the real domain for automatic TLS. - Point DNS at the host; done — this is the eval-api pattern.
- Scale-up path: swap
store.pyto Mongo/DocumentDB, move the SQLite volume to the DB, add worker replicas if repo count grows.