Help us measure site usage?

With your permission, we use self-hosted analytics to understand page usage. It is optional and does not affect the Service. Learn more.

JavaScriptintermediatewebAI generated

RSS Reader

Build an RSS reader: a Node.js server that subscribes to news and blog feeds, fetches them regularly, turns the different feed formats (RSS 2.0 and Atom) into one consistent article format, removes duplicates and stores everything, and a React interface where you read articles, see what's unread, mark things as read and star favorites. The server fetches politely, using caching headers so unchanged feeds aren't downloaded again, handles broken or slow feeds without affecting the others, and cleans article HTML so it's safe to display. You'll learn parsing XML feeds, background scheduling in Node.js, HTTP caching with ETag and Last-Modified, deduplication, sanitizing HTML, and building a React reading interface.

Estimate
~14h
Steps
7
Completed by
0
Proposed by
codeseed.app

React · Node.js

Project roadmap

  1. 01

    Define the data and API

    ~1.5h

    Write DESIGN.md: feeds (URL, title, last fetched, ETag and Last-Modified, and last error), articles (feed, a unique id from the feed's guid or link, title, link, author, published date, a cleaned summary, read and starred flags), and the API: add and remove feeds, list articles (by feed, unread only, starred, paginated), and mark read, unread and starred. Done when: DESIGN.md defines the data and every endpoint.

  2. 02

    Fetch and parse feeds

    ~2.5h

    In Node.js, fetch a feed with a timeout and a descriptive user agent, sending If-None-Match and If-Modified-Since from the last fetch (a 304 means nothing changed). Parse RSS and Atom (with a library such as fast-xml-parser or rss-parser) into one article shape, choosing a stable id and parsing dates in their different formats. Done when: several real feeds of both formats are parsed into consistent articles.

  3. 03

    Store and deduplicate

    ~2h

    Store feeds and articles in SQLite (for example with better-sqlite3), with a unique index on feed plus article id, and insert new articles while ignoring ones already stored. Clean article HTML with a sanitizer (such as sanitize-html) allowing only safe tags, and create a short plain-text summary. Done when: fetching the same feed twice doesn't create duplicates, and stored HTML contains no scripts.

  4. 04

    Refresh on a schedule

    ~2h

    Refresh all feeds every 30 minutes (and one feed on demand), a few at a time. Record errors per feed without stopping others, back off feeds that keep failing, and mark feeds as broken after many failures. Log each refresh's result. Done when: a broken feed URL doesn't stop the others from updating, and its error is shown in the feed list.

  5. 05

    Build the API

    ~1.5h

    Expose the endpoints from DESIGN.md with Express (or another framework), validating input: adding a feed checks the URL and that it actually returns a feed before saving. Return unread counts per feed. Done when: every endpoint works with curl.

  6. 06

    Build the React reader

    ~2.5h

    Build a React interface with a feed list showing unread counts, an article list (newest first, with unread in bold), and a reading pane showing the cleaned content with a link to the original. Opening an article marks it read; add buttons for unread, star, mark all as read, and filters for unread and starred. Add keyboard shortcuts (j and k to move, s to star). Done when: reading, marking and filtering work smoothly.

  7. 07

    Test it

    ~2h

    Write tests with saved feed files (RSS, Atom, broken XML, missing dates and duplicate items): parsing, id choice, deduplication, HTML cleaning, the 304 handling with a fake server, and the API endpoints. Done when: all tests pass without network access.

Ready to build this?

Get a GitHub repo and start building. Your AI reviewer checks each step as you go.

~14h · 7 steps

Tech stack

ReactNode.js