← Vishal Gurung

Nyuz

2026

Collects articles, groups the ones covering the same event, and sends you a briefing of only what matches your interests.

Built with
TypeScript
Year
2026

What it is

Nyuz collects articles from feeds, works out which ones are covering the same real-world event, matches those events against what you actually follow, and sends you a briefing. You stop searching for information and start receiving it.

It is in development and not accepting customers.

The part that mattered to get right

The obvious design is per-user. Collect feeds, filter them for each subscriber, send each subscriber their own copy.

That does not survive contact with a few thousand people. The same story gets fetched, parsed, summarised and stored again for every single reader who might want it, and the expensive work is duplicated N times for one result.

Nyuz is built around shared events instead. Articles are collected once and consolidated into an event — one real thing that happened, however many outlets covered it. Readers are then matched against those shared events. The expensive work happens once and is reused by everyone who cares about that event.

per-user design                    Nyuz

feed ──▶ parse ──▶ filter ──▶ ✉     feed ──▶ parse ──┐
feed ──▶ parse ──▶ filter ──▶ ✉     feed ──▶ parse ──┼─▶ EVENT ──▶ match ──▶ ✉
feed ──▶ parse ──▶ filter ──▶ ✉     feed ──▶ parse ──┘     (once)   (per reader)
   × N readers                         one pipeline

The clustering is the expensive part, and it is the part that benefits most from being done exactly once.

Code-first, on purpose

The instinct with an AI product is to reach for a model wherever the logic gets awkward. Nyuz deliberately does not, for most of the pipeline.

Clustering, topic handling, matching, exclusions, ranking and filtering are implemented as explicit application and database logic. Not because models cannot do these things, but because:

Models are used where they earn their place — controlled long-form generation of the briefing text itself — behind a provider abstraction so the underlying model can change without rewriting the system.

What is built

The unglamorous part

The pipeline is measured. Source failure rates, enrichment and backoff behaviour, how many events match how many readers, cost ceilings, and what the recovery path is when any of it goes wrong.

Background jobs that fail silently are how a system becomes unexplainable six months later. Nyuz keeps the accounting close to the thing it is accounting for.

Stack

TypeScript, React 19, TanStack Start and Router, Vite and Nitro, Cloudflare Workers with scheduled processing, Postgres through Supabase, Supabase Auth, Tailwind and Radix. Tested with Vitest and Playwright.

Small team of one, which is why the boring parts are very carefully instrumented.

Vishal Gurung ← Projects