A reading list
your model earns
one source at a time.
AI News watches the feeds you trust, dedupes them with cheap models, classifies the survivors, and ships ranked items to your feed and Telegram. Self-hosted. Bring your own keys. Runs anywhere Node 20 runs.
The path
of one item.
Three pipeline stages — Collect, Polish, Classify — with a parallel watcher subsystem that pushes to Telegram. Each step has a clear input, a clear output, and a budget. Hover to pause and inspect; click to expand the contract.
Four surfaces.
One mental model.
The product is small on purpose. A feed to read, a watcher list to govern intake, a Telegram digest for ambient capture, and an activity log so nothing is opaque.
The reading list
Reverse-chronological, keyboard-first. High-signal items get a left rail. Read state is sticky across reloads. j/k to walk, d to dismiss.
Source health
RSS, GitHub releases, and arbitrary HTML. Per-source cadence, etag caching, error budget. One screen tells you what's alive and what isn't.
Ambient capture
High-signal items push to a chat with two inline buttons: ➕ Add to board, or 🔕 Mute source (disables that watcher source entirely). The deep-link opens the item in-app. No app required to triage.
Nothing opaque
Every run, every stage, every error. Tail the live log, or scroll history. Cost per run, tokens per stage, drop reasons — all there.
Anatomy
of one delivered item.
Every field on the card traces back to a stage in the pipeline. No black-box ranking. No mystery summaries.
Claude Haiku 4.5: faster, cheaper, and surprisingly capable for tool use
Anthropic released Haiku 4.5 today, positioning it as a near-Sonnet model at one-third the cost. Tool-use benchmarks land within 4 points of Sonnet 4.5, with median latency under 1.2s on short prompts. Pricing is $1/Mtok in, $5/Mtok out.
Source attribution — from watch
Domain, favicon, recency. Pulled straight from the watcher that emitted the item. No re-attribution downstream.
Editorial summary — from polish
Title and summary are normalized after dedup against the current batch and the last 50 DB items. If the LLM call fails, a deterministic polish fallback runs so the pipeline always makes forward progress.
High-signal rail — from publishedAt
Items published in the last hour get the high-signal rail. No numeric score, no weighted formula — just recency, computed in the feed at render time.
Receipts — from activity
Tokens and dollars are tracked per pipeline run, not per item. Each run's cost lands on the pipeline_runs row and rolls into the daily budget ledger. There is no per-item cost drilldown.
Bring keys.
Ship in 90 seconds.
Three commands, one Railway deploy. No accounts to make, no SaaS to subscribe to. Your sources, your models, your bill.
Node 20+, a Gemini key,
and one search provider key.
Gemini handles all three pipeline stages on the free tier (250 RPD on Flash, 1k RPD on Flash-Lite). Pick at least one search provider; the chain falls through on quota.
What solo devs
actually ask.
The questions that come up in DMs, in order of how often we hear them.
SearchProvider / LLMProvider in server/providers/types.ts), so swapping in OpenAI-compatible or local Ollama is a contained change — see scripts/test-ollama-provider.ts for the WIP path.@BotFather (/newbot) and save the token. Send the bot any message, then curl https://api.telegram.org/bot<token>/getUpdates to discover your chat ID. Generate a webhook secret with openssl rand -hex 32. Set TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID, TELEGRAM_WEBHOOK_SECRET, and WATCHER_ENABLED=true. Then run PUBLIC_URL=https://your-domain npx tsx scripts/register-telegram-webhook.ts. The webhook only listens for callback_query, so the destination is whichever chat ID you set in env — there is no broadcast surface to lock down.permanent_failure.Docs/railway/DEVOPS_PLAYBOOK.md walks the manual setup; cookie-gated by AUTH_PASSWORD by default so you can share the URL but not the feed.One git clone.
One reading list.
AI News is open source and self-hosted, shaped by a small group of solo devs who got tired of feed apps that read for them. Run it on your laptop, on Railway, or on a $5 VPS.