shutdown-feed
Live AI & dev-tool product death tracker. Who got shut down, sunsetted, archived or acquihired this week — pulled in real time from Hacker News, GitHub and Reddit, classified by Claude Haiku.
The 2025–2026 wave of consolidation (OpenAI buying Astral, ClawHavoc nuking 341 skills, dozens of agentic IDEs eating each other) made dependency death a real DX problem. shutdown-feed is a single dashboard where you can watch the graveyard fill up in real time and pivot before your stack breaks.
What it does
- Ingests posts mentioning shutdowns, sunsets, acquisitions, wind-downs and end-of-life from three public sources (HN Algolia, GitHub Search, Reddit JSON) on cron.
- Classifies each post with
anthropic/claude-haiku-4.5via OpenRouter — extracts product name, category, severity and a neutral one-line summary, and discards anything that isn't actually a product death. - Serves a filterable, searchable, dark-themed SPA at
/shutdown-feed/with cursor pagination, keyboard navigation, and source/category/window/sort filters.
There are zero mocks. If a fetch fails, the dashboard simply shows fewer cards and reports the failure under /api/sources. If the classifier API key is missing, raw events still flow into the DB and the UI displays them once a key is configured.
Tech stack
- Node.js 20 + Express
- better-sqlite3 (WAL mode)
- node-cron (4 jobs)
- helmet + compression
- axios for HTTP
- Vanilla JS SPA (no build step)
Endpoints (all public, no auth)
| Path | Description |
|---|---|
| GET /shutdown-feed/ | SPA shell |
| GET /shutdown-feed/health | {status:"ok"} |
| GET /shutdown-feed/api/feed | Paginated feed (source, category, q, days, sort, cursor, limit, include_irrelevant) |
| GET /shutdown-feed/api/stats | Aggregate stats + per-source freshness |
| GET /shutdown-feed/api/sources | Recent refresh runs (success/failure log) |
| GET /shutdown-feed/api/event/:id | Single event detail (incl. raw upstream payload) |
| POST /shutdown-feed/api/refresh | Trigger background refresh (rate-limited: 1 / IP / 60s) |
Data sources & refresh cadence
| Source | URL | Auth | Cadence |
|---|---|---|---|
| Hacker News (Algolia) | https://hn.algolia.com/api/v1/search | none | every 30 min |
| GitHub repository search | https://api.github.com/search/repositories | optional GITHUB_TOKEN | every 60 min |
| Reddit (5 dev subs) | https://www.reddit.com/r/{sub}/search.json | none (UA required) | every 45 min |
| Classifier (OpenRouter / Haiku) | https://openrouter.ai/api/v1/chat/completions | OPENROUTER_API_KEY | every 10 min |
On boot every source runs once after a short stagger so the dashboard isn't empty.
Configuration
Copy .env.example to .env:
PORT=4810
BASE_PATH=/shutdown-feed
DB_PATH=./data/shutdown-feed.db
ENABLE_CRON=true
OPENROUTER_API_KEY=sk-or-...
GITHUB_TOKEN=ghp_...
In production, deploy injects OPENROUTER_API_KEY and GITHUB_TOKEN from the RNDLAB vault — the __INJECT_FROM_VAULT__ placeholders in .env.example are the contract for that.
Run locally
npm install
cp .env.example .env # fill in OPENROUTER_API_KEY
npm start
# open http://localhost:4810/shutdown-feed/
Keyboard shortcuts
| Key | Action |
|---|---|
| / | Focus search |
| j / k | Move card selection down / up |
| o or Enter | Open selected card in new tab |
| Esc | Blur search |
License
MIT.