A modern, full-stack RSS reader web application. Subscribe to RSS feeds, organize them into folders, and read articles in a clean list view.
- Frontend: React 19 + Vite + TypeScript + Tailwind CSS
- Backend: Node.js + Express + TypeScript
- Database: Prisma ORM with SQLite (upgradeable to PostgreSQL)
- State Management: TanStack React Query + React Context API
- Node.js 20.19+
- npm 9+
-
Clone and install
git clone <repo-url> cd rss npm install
-
Configure environment
cp .env.example .env # Edit .env with your secrets (JWT_SECRET, Google OAuth credentials) -
Set up the database
npm run db:generate # Generate Prisma client npm run db:push # Create database tables npm run db:seed # Seed with demo data
-
Start development servers
npm run dev # Starts both backend (:3001) and frontend (:5173) -
Open http://localhost:5173 in your browser.
| Field | Value |
|---|---|
| demo@example.com | |
| Password | password123 |
rss/
├── server/ # Express backend
│ ├── prisma/
│ │ ├── schema.prisma # Database schema
│ │ └── seed.ts # Seed script
│ ├── prisma.config.ts # Prisma v7 config (datasource URL)
│ ├── generated/ # Generated Prisma client (do not edit)
│ └── src/
│ ├── index.ts # App entry point
│ ├── middleware/ # Auth middleware
│ ├── routes/ # API routes (auth, feeds, folders, articles)
│ ├── services/ # Feed parser & refresher
│ ├── lib/ # Prisma client
│ └── __tests__/ # Backend tests
├── web/ # React frontend
│ └── src/
│ ├── api/ # Axios client & API functions
│ ├── components/ # UI components
│ ├── contexts/ # Auth context
│ ├── hooks/ # React Query hooks
│ └── __tests__/ # Frontend tests
├── docs/
│ └── TESTS.md # Test documentation
├── package.json # Root workspace config
└── README.md
- 📧 Email/password & Google OAuth authentication
- 📁 Organize feeds into folders
- 📰 Expandable article list view with inline reading
- 🔍 Search articles
- ✅ Mark as read/unread, mark all read
- 🔄 Automatic feed refresh (every 15 minutes)
- 📱 Mobile responsive
| Command | Description |
|---|---|
npm run dev |
Start both servers in development mode |
npm test |
Run all tests |
npm run build |
Build for production |
npm run db:generate |
Generate Prisma client (run after schema changes) |
npm run db:push |
Push Prisma schema to database |
npm run db:seed |
Seed database with demo data |
- Update
server/prisma/schema.prisma:datasource db { - provider = "sqlite" + provider = "postgresql" } - Update
DATABASE_URLin.envto your PostgreSQL connection string. - Swap the driver adapter in
server/src/lib/prisma.ts:npm install @prisma/adapter-pg pg npm uninstall @prisma/adapter-better-sqlite3 better-sqlite3
- import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3'; + import { PrismaPg } from '@prisma/adapter-pg'; - const adapter = new PrismaBetterSqlite3({ url: ... }); + const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
- Run
npx prisma generate && npm run db:pushto apply.