Upstream:为依赖仓库提供发布情报的开源工具
anywaylupin/upstream
Upstream 是一款开源工具,可读取技术栈中每个仓库的 changelog,汇总变更内容、标记破坏性变更并评估升级工作量,还提供五维项目评分和 AI 项目指南。它支持八家 AI 提供商的密钥(BYOK),按用户时区以日/周/双周/月或自定义间隔通过邮件推送摘要。摘要按 release body 的 sha256 去重,以控制 LLM 配额消耗。
Release intel for the repos you depend on.
Upstream reads every changelog in your stack, flags what breaks, estimates the upgrade effort and rates the project.
What it does
- Digest - every release across your stack, summarized into what changed, what breaks and how much work the upgrade is.
- Breaking radar - breaking changes and deprecations surfaced first.
- Repo reports - a five-part rating, an AI guide to the project, and alternatives lined up against it.
- Your key, your model - bring a key for any of eight providers, or run on the shared one.
- On your schedule - daily, weekly, biweekly, monthly or every N days, in your own time zone, delivered by email.
Stack
No Redis, no queues, no Docker, no monorepo.
Quick start
pnpm install
cp .env.example .env # then fill it in
pnpm db:push
pnpm devEvery variable is documented in .env.example, including how
to obtain each key. The minimum to boot: DATABASE_URL, AUTH_SECRET, a
GitHub OAuth app, and one AI provider key.
Scripts
| Command | Does |
|---|---|
pnpm dev |
Dev server |
pnpm db:push |
Push the schema to Neon |
pnpm ingest |
Fetch releases for every catalogue repo |
pnpm summarize |
Summarize un-summarized releases |
pnpm sync |
A full manual run, recorded in runs |
pnpm check:schedule |
Assert the digest date maths |
pnpm typecheck |
tsc --noEmit |
pnpm lint |
biome check |
How it works
Summaries are deduped by content hash. A summary is keyed on the sha256 of the release body, not the release id, so identical notes across repos or re-runs are summarized once, ever. That is what keeps the project inside free-tier LLM quota.
Repos are a shared catalogue; a stack is one user's slice of it. Ingestion and summary dedupe stay global while every view is scoped to the person asking.
The cron tick is project-wide, the schedule is per user. Vercel Cron cannot
fire per user, so /api/cron/ingest runs hourly and isDigestDue() decides
whose digest is due, reading the hour in each user's own IANA zone.
Model ids are never trusted. gemini-2.5-flash was retired mid-project and
broke every summary silently. Keys and models are now probed with a live call
before they are saved.
More detail, and the traps worth not reintroducing, live in
AGENTS.md.
Status
Working: ingestion, summarization, auth, per-user stacks, digest with filters, repo reports, BYOK across eight providers, search, scheduled runs, email delivery, account erase.
Not built yet: an eval harness, Playwright E2E, read state, non-GitHub-Release changelogs, and rate-limit backoff.
License
来源:GitHub · github.com