after-astral
Live public watch on the Python tooling ecosystem after OpenAI's
acquisition of Astral on 2026-03-19
(the company behind uv, ruff, and ty).
Two months in, are devs sticking with Astral's tools or quietly migrating?
This dashboard pulls real signals every six hours and shows the answer.
What you see
- Day counter — days since
2026-03-19. - Astral repos —
astral-sh/uv,astral-sh/ruff,astral-sh/tyand 4 others, with stars, forks, open issues, 7-day Δstars, 30-day Δstars, commit counts. - Alternatives — Poetry, Hatch, PDM, Pixi, pipx, Pyright, mypy, Black, isort, etc. Same metrics.
- PyPI downloads — last-day / last-week / last-month for 21 packages, via pypistats.org.
- Recent forks — last 30 forks of each
astral-sh/*repo, in case a community fork takes off. - Hacker News — every story or comment matching
astral-sh,uv ruff,uv python,"ruff" python, orty-pythonsince the acquisition date. - Timeline — merged events from HN and Astral's blog.
Stack
- Node.js 20 + Express
- better-sqlite3 (WAL mode)
- node-cron
- helmet + compression + cors
- Vanilla JS SPA, dark theme, English UI (international audience)
Data sources (all public, no API keys required)
| Source | Endpoint | Refresh |
|---|---|---|
| GitHub REST | api.github.com/repos/{o}/{r} | every 6 h |
| GitHub commits | api.github.com/repos/{o}/{r}/commits | every 6 h |
| GitHub forks | api.github.com/repos/{o}/{r}/forks?sort=newest | twice daily |
| GitHub code-search | api.github.com/search/code?q=... | twice daily |
| pypistats.org | /api/packages/{pkg}/recent | every 6 h |
| HN Algolia | hn.algolia.com/api/v1/search_by_date | hourly |
| Astral blog | https://astral.sh/blog (HTML) | twice daily |
Optionally set GITHUB_TOKEN to lift the GitHub rate limit from 60/h to
5000/h. Without it, the dashboard still works — just paginates more slowly.
Anti-mock guarantee
There is no fake data anywhere in this codebase. Every numeric value
on the dashboard comes from one of the public sources above. If a fetcher
fails, the previous snapshot stays in the DB and the matching panel shows
a "stale" badge. Verify by opening GET /after-astral/api/fetch-log.
Run locally
cp .env.example .env
npm install
npm start
# open http://localhost:4884/after-astral/
Endpoints
GET /after-astral/— SPAGET /after-astral/health—{status:'ok', version, lastRefresh, …}(200, public)GET /after-astral/api/summaryGET /after-astral/api/astral-reposGET /after-astral/api/alternativesGET /after-astral/api/downloads?package=uv&days=30GET /after-astral/api/downloads-overviewGET /after-astral/api/forks?repo=astral-sh/uv&limit=20GET /after-astral/api/hn?limit=100GET /after-astral/api/migration-mentions?limit=50GET /after-astral/api/timeline?limit=200GET /after-astral/api/fetch-log?limit=50POST /after-astral/api/refresh(rate-limited to once per 5 min, public)
License
Part of the Holy AI showcase. Not affiliated with Astral or OpenAI.