Kiroween 2026 · Resurrection category · Built with Kiro
🌐 Try Live Demo | 📖 Deployment Guide
Algorithmic feeds bury what readers actually want. GhostFeed brings back reader-owned subscription: subscribe to any RSS/Atom feed, see at a glance which sources are alive or dead, and get a short daily digest. No sign-up required — judges can try it in under a minute.
- Subscribe to any feed — paste an RSS/Atom URL; it is fetched and parsed server-side (no CORS issues).
- Read newest-first — items across your feeds, with source and date; click through to the original.
- Graveyard — a feed is marked Dead if it hasn't published in 90+ days or its last 3 fetches failed. Dead feeds show their last-alive date and last error, and recover automatically if they publish again.
- Replacements — dead sources get a curated replacement suggestion (never an invented URL), addable in one click.
- Daily digest — top items of the last 24h. Rule-based by default; set
LLM_BASE_URL+LLM_API_KEY(OpenAI-compatible, e.g. new-api) for an AI summary, with automatic fallback to rule-based.
npm install
npm run dev # http://localhost:3000
npm run build # production checkMultiple deployment options available — see DEPLOYMENT.md for complete guides.
Since Vercel is not available, we provide 5 deployment options:
- Docker + VPS (Recommended) — Full control, easy to manage
- Netlify — Easiest, free tier, auto-deploy
- Railway — Simple, $5 free credit, auto-deploy
- Cloudflare Pages — Free, global CDN, unlimited bandwidth
- PM2 + Nginx + VPS — Traditional setup, full control
Quick Start (Docker + VPS):
# On your VPS
git clone <your-repo>
cd ghostfeed
docker compose up -dQuick Start (Netlify):
# Push to GitHub, then connect at netlify.com
git push origin main
# Follow Netlify dashboard to import projectThe app runs without environment variables (rule-based digest). For AI-powered digest, set LLM_BASE_URL, LLM_API_KEY, and LLM_MODEL in your deployment platform.
GhostFeed uses a provider interface for digest generation with two implementations:
- Rule-based (default) — simple numbered list, no LLM needed
- AI-powered — connects to any OpenAI-compatible endpoint (OpenAI, new-api, local models)
To enable AI summaries, create a .env.local file:
LLM_BASE_URL=https://your-new-api.example.com/v1
LLM_API_KEY=sk-...
LLM_MODEL=gpt-4o-mini # optional, defaults to gpt-4o-miniThe system automatically falls back to rule-based digest if the LLM fails — the page never crashes.
- Spec-driven development:
.kiro/specs/ghostfeed/holdsrequirements.md,design.md, andtasks.md— the spec was written before the code. - Steering docs:
.kiro/steering/(product / tech / structure) keeps every change aligned: no sign-up, server-side RSS only, never invent a feed URL. - Agent hooks:
.kiro/hooks/on-save-typecheck.jsonrunstsc --noEmiton save. - Property-based testing (Week 2): parser invariants — any valid RSS/Atom sample parses without throwing.
Next.js 14 (App Router) · TypeScript · Tailwind CSS · rss-parser · localStorage (no database, no auth in the MVP)
MIT — see LICENSE.