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
- html/css
- javascript
- mcp
- node.js
- opml
- rss