Inspiration

Google Reader died in 2013. RSS never really died — it just needed a comeback. Revenant Reader resurrects the classic feed reader for the agent era: your feeds, your data, no account, no tracking, no cloud.

What it does

  • Add any RSS 2.0 / Atom feed by URL; refresh all feeds with one click; remove feeds from the sidebar, API, or MCP.
  • Unread counts, newest-first reading, full-text search across feeds, unread-only filter per feed, mark-all-read, and keyboard shortcuts (j/k to move, x to mark read, Enter to open).
  • OPML import/export — move subscriptions in and out with any reader.
  • Per-feed "last refreshed" time and refresh errors in the sidebar; conditional fetches (etag / Last-Modified) skip unchanged feeds.
  • Built-in MCP server with nine tools (list_feeds, search_items, mark_read, mark_all_read, add_feed, remove_feed, unread_count, export_opml, import_opml), plus feed resources (revenant://feed/) and a morning-briefing prompt — sharing the exact same store as the web UI. What the agent does shows up in the browser, and vice versa.
  • Zero frameworks, one dependency (fast-xml-parser), no build step, no tracking, no account, no cloud.

How we built it (How Kiro was used)

Spec-first with Kiro: three specs under .kiro/specs/ (feed-engine, reader-ui, mcp-server), each with requirements, design, and trackable task checklists. Steering files (product, tech, structure, API and testing standards) kept every session consistent, agent hooks run lint-on-save and the test suite on session end, and .kiro/settings/mcp.json wires the project's own MCP server into Kiro. Kiro CLI agent sessions were attempted — one implemented the remove-feed feature — but the agent was unstable in this environment, so most of the implementation was done directly from the specs. The full .kiro/ directory is in the repo root, as the Kiroween rules require.

Challenges we ran into

  • Keeping the reader fully local-first while making its state shared live between the web UI and the MCP server (solved with one shared JSON store).
  • Conditional fetching and per-feed error handling so one slow or rate-limited feed never blocks the rest.

Accomplishments that we're proud of

  • 14/14 automated tests passing; live deployment on Railway; a 70-second demo video shot entirely from the live app.
  • A reader that an AI agent can genuinely use — not a wrapper, but the same store, same tools, same data.

What's next

  • Headless DOM smoke test for the UI.
  • More feed formats and a shareable OPML directory.

Built With

Share this project:

Updates

Submission history