← back to gallery

Sunset Radar

Live deprecation calendar across six major LLM providers — never get surprised by a shutdown.

aillmdeprecationcalendarapimonitoringopenaianthropic
Open product ↗

sunset-radar

Know when your AI model dies. A live deprecation calendar across the six
biggest LLM providers, refreshed every six hours from their official docs.

Live · RSS · JSON Feed · API

## Why
Every quarter, OpenAI / Anthropic / Google / AWS / Azure / Mistral retire
models. Production apps break silently. Devs find out from a 500 error.

sunset-radar aggregates the deprecation pages from all six providers in a
single timeline with countdowns and migration suggestions, plus an RSS / JSON
feed of newly-announced sunsets so you can wire it into Slack or email.

Data sources

All data comes from official provider docs — no mocks, no seeds. Refreshed every
six hours via node-cron.

| Provider | Source | Refresh |
|---|---|---|
| Anthropic | https://docs.claude.com/en/docs/about-claude/model-deprecations | every 6h |
| OpenAI | https://platform.openai.com/docs/deprecations (via r.jina.ai readability proxy — the original page is JS-rendered and rejects bots) | every 6h |
| Google Vertex AI | https://cloud.google.com/vertex-ai/generative-ai/docs/deprecations | every 6h |
| Azure OpenAI | https://learn.microsoft.com/en-us/azure/foundry/openai/concepts/model-retirements | every 6h |
| AWS Bedrock | https://docs.aws.amazon.com/bedrock/latest/userguide/model-lifecycle.html | every 6h |
| Mistral | https://docs.mistral.ai/getting-started/models/models_overview/ | every 6h |

API

All endpoints under /sunset-radar. No authentication.

| Endpoint | Description |
|---|---|
| GET /health | Liveness + per-provider freshness |
| GET /api/models | All tracked models. Filters: ?provider=, ?status=, ?days=, ?q= |
| GET /api/models/:provider/:name | One model + its event history |
| GET /api/timeline?months=12 | Month buckets of upcoming shutdowns |
| GET /api/events?limit=50 | Recent deprecation events |
| GET /api/stats | Aggregate counts by provider / status |
| GET /api/search?q= | Search across models, providers, replacements |
| GET /api/runs?limit=60 | Last fetch runs per provider |
| GET /api/refresh | Manually trigger a refresh (background) |
| GET /feed.xml | RSS 2.0 of recent events |
| GET /feed.json | JSON Feed of recent events |

Example:
``
curl https://holyai.me/sunset-radar/api/models?provider=anthropic&days=180
``

## Stack
- Node.js 20 (ES Modules)
- Express 4
- better-sqlite3 (WAL)
- node-cron
- cheerio (HTML parsing)
- helmet, compression, morgan
- Vanilla JS frontend, no build step

## Local dev
``
cp .env.example .env
npm install
node server.js
# open http://localhost:4737/sunset-radar/
``

The first refresh runs automatically on boot if the DB is empty or the most
recent successful run is older than 12 hours.

## Project structure
``
server.js Express bootstrap, route mount, cron
db.js SQLite (WAL) + prepared statements
fetchers/
index.js Orchestrator
http.js fetch + retry + UA
anthropic.js
openai.js via r.jina.ai readability proxy
google.js
azure.js
aws.js
mistral.js
lib/
dates.js ISO + lenient date parsing
diff.js emit deprecation_events on snapshot diff
rss.js RSS 2.0 + JSON Feed builders
routes/
api-models.js
api-timeline.js
api-events.js
api-stats.js
api-feed.js
api-search.js
public/
index.html
app.js vanilla SPA
style.css dark theme
DEPLOY_MANIFEST.json
SPEC.md
CLAUDE.md
``

## License
MIT.