Skip to main content
v1.0 · solo-dev news pipeline

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.

pipeline
3 stages
LLM
Gemini free tier
deploy
self-hosted
keys
BYOK
02 — how it works

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.

fig. 01 / pipeline
fig. 01 — pipeline ▸ liveRUNNING
01 · PARALLELWatch12,48002 · SEARCHCollect12,10203 · LLMPolish8,93204 · LLMClassify2,63805 · INLINEPersist2,63806 · INLINEDeliver2,638sources→ feed · telegram · sseSTAGEITEMS / MIN — last 60s
▸ click any stage to inspect inputs and outputs · hover to pause
⏸ pausedhover inspect  ·  click expand
03 — surfaces

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.

fig. 02 / surfaces
01 / FEED

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.

147 sources · 24h window
02 / WATCHERS

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.

3 source types supported
03 / TELEGRAM

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.

bot api · webhook delivery
04 / ACTIVITY

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.

full audit trail
04 — anatomy

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.

fig. 03 / item
Aanthropic.com·2h ago·▲ HIGH SIGNAL

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.

▲ HIGH SIGNALproduct_launchdeveloper
A

Source attribution — from watch

Domain, favicon, recency. Pulled straight from the watcher that emitted the item. No re-attribution downstream.

B

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.

C

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.

D

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.

05 — self-host

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.

fig. 04 / install
prerequisites

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.

geminiperplexitytavilyexaserpertelegram
~/projects · ai-news
$git clone https://github.com/yossefebrahim/ai-news-research-kanban
cloned · 412 files · main
$cp .env.example .env
› add GEMINI_API_KEY + at least one search provider key
$npm install && npm run dev
[ init ] migrations · seed · scheduler ready
[ next ] ▲ Local: http://localhost:3000
# in another terminal · trigger a manual run
$curl -X POST localhost:3000/api/pipeline/run
[collect ] 24 raw items · 4 providers
[polish ] 24 in · 17 dropped · 7 kept
[classify] 7 categorized · 1.2k tok · $0.0011
[ sink ] 7 → feed (sse) · 2 → telegram (watcher)
done in 6.4s · run · $0.0011 spent
$
06 — FAQ

What solo devs
actually ask.

The questions that come up in DMs, in order of how often we hear them.

fig. 05 / faq
01
What does it actually cost to run?
On Gemini's free tier you can run the full pipeline at no cost up to ~250 runs/day. Above that, expect $1–$3/month at small scale (one user, ~150 sources). Set a hard daily ceiling in settings; the budget guard halts the run if it would exceed.
02
Can I use my own model?
Today the LLM stages target Gemini directly. The provider layer is interface-driven (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.
03
How does the signal score work?
Stage 3 (Classify) tags each item with a category and one or more audiences — that is the entire classifier output. The high-signal rail in the feed is decided at render time: any item published in the last hour gets the rail. There is no numeric score and no weights to tune.
04
Telegram setup looks annoying — is it?
Real flow: create a bot with @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.
05
What happens if a source dies?
Each source tracks its consecutive failure count and last error (truncated to 1k chars), surfaced in the watchers dashboard. The poll cadence stays fixed; the cooldown still applies between attempts. For Telegram delivery, each item retries up to 6 times with exponential backoff (2 → 4 → 8 → 16 → 32 → 60 min cap) before being marked permanent_failure.
06
Is there a hosted version?
No, and no roadmap for one. Self-host is the product. 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.
07 — start

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.

~ 90 SECONDS TO FIRST ITEM · NO ACCOUNT · BYOK
AI NEWS · v1.0 · self-hostedrailway · self-host · BYOKbuilt for solo devs, 2026