A professional RSS feed aggregator built with Next.js 14, designed to centralize news from verified sources with a clean, Vercel-inspired interface. Stay informed without the noise, ads, or algorithmic manipulation.
- π° RSS Feed Aggregation - Automatic fetching and normalization of RSS/Atom feeds from trusted sources
- οΏ½ Automated Updates - Scheduled feed refresh every 30 minutes via Vercel Cron jobs
- ποΈ Smart Categorization - Organize articles by Technology, Science, Business, and Security
- π Full-text Search - PostgreSQL-powered search across titles, descriptions, and content with relevance ranking
- π Bookmarks System - Save articles permanently with user-linked bookmarks that survive article cleanup
- ποΈ Smart Cleanup - Three-tier article lifecycle: soft-delete (7 days), preservation for bookmarks, hard-delete (14 days)
- π¨ Vercel-inspired Design - Clean, minimal, professional UI with dark-first theme
- π Theme Switching - Dark/light mode with system preference support
- β‘ Instant Search - Cmd+K search palette with keyboard navigation
- π Smooth Animations - Framer Motion powered transitions and micro-interactions
- π± Responsive Design - Optimized for desktop, tablet, and mobile devices
- βΏ Accessibility - WCAG AA compliant with keyboard navigation and screen reader support
- π JWT Authentication - Secure httpOnly cookie-based authentication with 7-day sessions
- π₯ User Management - Role-based access control (ADMIN/USER)
- π‘οΈ Protected Routes - Middleware-protected API endpoints and admin pages
- π Password Security - bcrypt hashing with salt rounds
- ποΈ Source Management - Add, edit, toggle, and delete RSS sources
- π Job Monitoring - Real-time feed refresh job tracking with status indicators
- π€ User Administration - Manage user accounts and permissions
- π Dashboard Statistics - Total articles, active sources, job history
- π Analytics - Vercel Analytics and Speed Insights integrated
- π TypeScript - Full type safety across the entire codebase
- ποΈ Prisma ORM - Type-safe database queries with PostgreSQL
- π― RESTful API - Well-structured API routes with consistent responses
- π Comprehensive Logging - Detailed job logs and error tracking
- Framework: Next.js 14 (App Router) with React 19
- Language: TypeScript 5
- Styling: Tailwind CSS v4 with custom design tokens
- Components: shadcn/ui (Radix UI primitives)
- Animations: Framer Motion for smooth transitions
- Icons: Lucide React
- Theme: next-themes for dark/light mode
- Runtime: Node.js with Edge Runtime support
- Database: PostgreSQL 14+
- ORM: Prisma 6 with driver adapters
- Authentication: JWT (jsonwebtoken) + bcrypt
- RSS Parsing: rss-parser with custom normalization
- Cron Jobs: Vercel Cron for automated feed fetching
- Analytics: Vercel Analytics & Speed Insights
- Fonts: Geist Sans & Geist Mono
- Linting: ESLint with Next.js config
- Type Checking: TypeScript strict mode
- Package Manager: npm
- Deployment: Vercel (optimized)
- Database Hosting: Vercel Postgres or any PostgreSQL provider
- Edge Functions: API routes with edge runtime
- Monitoring: Built-in job logging and error tracking
- Node.js 18+ (LTS recommended)
- PostgreSQL 14+ (local or cloud-hosted)
- npm or yarn package manager
- Git
The fastest way to get FeedCentral running locally:
# Clone the repository
git clone https://github.com/BENZOOgataga/feedcentral.git
cd feedcentral
# Install dependencies
npm install
# Set up environment variables
cp .env.example .env
# Edit .env with your database credentials
# One-command setup (validates env, generates Prisma client, pushes schema, seeds data)
npm run setup
# Start development server
npm run devOpen http://localhost:3000 to see the app.
git clone https://github.com/BENZOOgataga/feedcentral.git
cd feedcentral
npm installCreate a .env file in the root directory:
# Database (use one of these)
DATABASE_URL="postgresql://user:password@localhost:5432/feedcentral"
# OR for Vercel Postgres
POSTGRES_URL="postgres://..."
# JWT Secret (min 32 characters, generate with: openssl rand -base64 32)
JWT_SECRET="your-super-secret-jwt-key-min-32-chars"
# Admin Credentials (for initial setup)
ADMIN_USERNAME="admin@feedcentral.local"
ADMIN_PASSWORD="admin123"
# Optional: Cron job security
CRON_API_KEY="your-cron-secret-key"
# Optional: Database seeding security
SEED_SECRET_KEY="your-seed-secret-key"π See docs/ENVIRONMENT_SETUP.md for complete configuration guide.
# Validate environment variables
npm run check-env
# Generate Prisma client
npm run db:generate
# Push schema to database (creates tables)
npm run db:push
# Seed with initial data (categories, sources, admin user)
npm run db:seedOr use the all-in-one command:
npm run setupnpm run devThe application will be available at http://localhost:3000
After seeding, you can login with:
- Email:
admin@feedcentral.local(or your ADMIN_USERNAME) - Password:
admin123(or your ADMIN_PASSWORD)
FeedCentral is optimized for Vercel deployment with zero configuration.
-
Connect Repository
- Push your code to GitHub
- Import project in Vercel dashboard
- Vercel auto-detects Next.js configuration
-
Configure Database
- Add Vercel Postgres from the Storage tab
- Database URL is automatically added to environment variables
-
Set Environment Variables
In Vercel dashboard, add:
JWT_SECRET=<generate-with-openssl-rand-base64-32> ADMIN_USERNAME=your-admin-email@domain.com ADMIN_PASSWORD=your-secure-password CRON_API_KEY=<optional-cron-security-key> SEED_SECRET_KEY=<optional-seed-security-key> -
Deploy
- Click "Deploy"
- Vercel builds and deploys automatically
- Access deployment URL provided by Vercel
-
Seed Database
After first deployment:
curl "https://your-app.vercel.app/api/admin/seed?key=YOUR_SEED_SECRET_KEY" -
Set up Cron Jobs
Vercel Cron is already configured in
vercel.json:{ "crons": [{ "path": "/api/cron/fetch-feeds", "schedule": "*/30 * * * *" }] }
| Variable | Required | Description | Example |
|---|---|---|---|
DATABASE_URL |
Yes* | PostgreSQL connection string | postgresql://user:pass@host:5432/db |
POSTGRES_URL |
Yes* | Vercel Postgres URL (auto-set) | postgres://... |
JWT_SECRET |
Yes | Secret for JWT signing (min 32 chars) | openssl rand -base64 32 |
ADMIN_USERNAME |
No | Initial admin email | admin@feedcentral.local |
ADMIN_PASSWORD |
No | Initial admin password | admin123 |
CRON_API_KEY |
No | Cron endpoint security key | your-secret-key |
SEED_SECRET_KEY |
No | Seed endpoint security key | your-secret-key |
*Use either DATABASE_URL or POSTGRES_URL (Vercel auto-provides the latter)
FeedCentral can be deployed to any platform supporting Node.js and PostgreSQL:
- Railway: Connect GitHub repo, add PostgreSQL plugin
- Render: Create Web Service + PostgreSQL database
- DigitalOcean: App Platform with managed PostgreSQL
- AWS: Elastic Beanstalk + RDS PostgreSQL
- Self-hosted: Any VPS with Node.js 18+ and PostgreSQL 14+
- Set up PostgreSQL database
- Configure environment variables
- Build:
npm run build - Run:
npm run start - Seed database via API endpoint
- Set up cron job to hit
/api/cron/fetch-feedsevery 30 minutes
- Change default admin credentials
- Set strong JWT_SECRET (min 32 characters)
- Configure secure database credentials
- Set up SSL/TLS certificates
- Enable CORS if needed
- Configure rate limiting
- Set up error monitoring (Sentry, etc.)
- Configure backup strategy for database
- Test cron job execution
- Verify analytics integration
π See docs/DEPLOYMENT.md for detailed deployment guide.
feedcentral/
βββ app/ # Next.js App Router
β βββ (app)/ # Main app route group
β β βββ [category]/ # Dynamic category pages
β βββ admin/ # Admin panel
β β βββ page.tsx # Admin dashboard
β β βββ sources/ # RSS source management
β β βββ jobs/ # Feed job monitoring
β β βββ users/ # User management
β β βββ settings/ # Admin settings
β βββ api/ # API routes
β β βββ articles/ # Article CRUD endpoints
β β βββ auth/ # Authentication (login, logout, me)
β β βββ bookmarks/ # Bookmark management
β β βββ search/ # Full-text search
β β βββ stats/ # Dashboard statistics
β β βββ sources/ # Public source listing
β β βββ admin/ # Admin API (sources, jobs, users, seed)
β β βββ cron/ # Cron job endpoints
β β βββ user/ # User profile endpoints
β βββ app/ # User-facing app
β β βββ page.tsx # Main feed dashboard
β β βββ bookmarks/ # Saved articles
β β βββ dashboard/ # User dashboard
β β βββ settings/ # User preferences
β βββ article/[id]/ # Article reader
β βββ login/ # Login page
β βββ changelog/ # Changelog page
β βββ privacy/ # Privacy policy
β βββ terms/ # Terms of service
β βββ page.tsx # Landing page
β βββ layout.tsx # Root layout
β βββ globals.css # Global styles
β
βββ components/ # React components
β βββ admin/ # Admin-specific components
β β βββ AddSourceDialog.tsx # Add RSS source dialog
β βββ analytics/ # Analytics wrappers
β βββ changelog/ # Changelog notifications
β βββ feed/ # Feed display components
β β βββ FeedCard.tsx # Article card
β β βββ FeedList.tsx # Article list container
β β βββ FeedSkeleton.tsx # Loading skeleton
β β βββ EmptyState.tsx # Empty state UI
β βββ layout/ # Layout components
β β βββ TopNav.tsx # Top navigation bar
β β βββ SideNav.tsx # Sidebar navigation
β β βββ AppTabs.tsx # Category tabs
β β βββ AdminSideNav.tsx # Admin sidebar
β β βββ UserMenu.tsx # User dropdown menu
β βββ reader/ # Article reader components
β β βββ ArticleHeader.tsx # Article metadata header
β β βββ ArticleContent.tsx # Article content display
β βββ search/ # Search components
β β βββ CommandSearch.tsx # Cmd+K search palette
β βββ theme/ # Theme management
β β βββ ThemeProvider.tsx # Theme context provider
β β βββ ThemeToggle.tsx # Dark/light mode toggle
β βββ providers/ # React context providers
β β βββ PreferencesProvider.tsx
β βββ ui/ # shadcn/ui components
β βββ button.tsx
β βββ dialog.tsx
β βββ input.tsx
β βββ toast.tsx
β βββ ...
β
βββ lib/ # Utilities and services
β βββ auth.ts # Authentication utilities (verifyAuth, requireAuth, requireAdmin)
β βββ prisma.ts # Prisma client singleton
β βββ rss-parser.ts # RSS feed parser with normalization
β βββ env.ts # Environment variable validation
β βββ utils.ts # Helper functions (cn, formatters)
β βββ decode-html.ts # HTML entity decoder
β βββ changelog-data.ts # Changelog content
β βββ hooks/ # Custom React hooks
β βββ useAuth.tsx # Auth context and hooks
β βββ useToast.ts # Toast notifications
β
βββ prisma/ # Database
β βββ schema.prisma # Database schema
β βββ seed.ts # Seed script
β βββ migrations/ # Database migrations
β βββ README.md # Prisma documentation
β
βββ scripts/ # Build and utility scripts
β βββ check-env.js # Environment validation
β βββ postbuild.js # Post-build tasks
β βββ ...
β
βββ docs/ # Documentation
β βββ QUICK_START.md # 5-minute setup guide
β βββ DEVELOPER_GUIDE.md # Architecture and development
β βββ ENVIRONMENT_SETUP.md # Environment configuration
β βββ DEPLOYMENT.md # Deployment instructions
β βββ IMPLEMENTATION_SUMMARY.md # Feature implementation status
β βββ ...
β
βββ types/ # TypeScript type definitions
β βββ index.ts
β
βββ public/ # Static assets
βββ .env # Environment variables (gitignored)
βββ .env.example # Environment template
βββ package.json # Dependencies and scripts
βββ tsconfig.json # TypeScript configuration
βββ next.config.js # Next.js configuration
βββ tailwind.config.ts # Tailwind CSS configuration
βββ vercel.json # Vercel deployment config
βββ README.md # This file
Comprehensive guides for developers, administrators, and contributors:
- Quick Start Guide - Get running in 5 minutes
- Environment Setup - Detailed environment configuration for local and production
- Deployment Guide - Step-by-step Vercel deployment instructions
- Developer Guide - Architecture, components, design system, and what's implemented
- Implementation Summary - Complete feature list and implementation status
- UI/UX Specs - Design specifications, animations, and interaction patterns
- Architecture Plan - Original system architecture and design decisions
- Cron Setup - Automated feed fetching configuration
- Scripts Reference - Available npm scripts and utilities
- Database Schema - Prisma schema documentation
- Changelog - Version history and updates
- Fixes Applied - Bug fixes and improvements log
- Optimization Summary - Performance optimizations
npm run dev # Start development server at http://localhost:3000
npm run build # Build for production
npm run start # Start production server
npm run lint # Run ESLint
npm run lint:fix # Run ESLint and auto-fix issues
npm run type-check # Run TypeScript compiler without emitting filesnpm run check-env # Validate environment configuration
npm run setup # One-command setup (check-env + generate + push + seed)
npm run db:generate # Generate Prisma client from schema
npm run db:push # Push schema changes to database (dev)
npm run db:migrate # Create and run migrations (production)
npm run db:seed # Seed database with initial data
npm run db:studio # Open Prisma Studio GUI for database management
npm run db:reset # Reset database (DANGEROUS: deletes all data)npm run postinstall # Automatically runs after npm install (generates Prisma client)FeedCentral provides a comprehensive RESTful API for articles, authentication, bookmarks, and admin operations.
| Endpoint | Method | Description |
|---|---|---|
/api/articles |
GET | Fetch articles with pagination, category/source filtering |
/api/articles/[id] |
GET | Get single article by ID |
/api/search |
GET | Full-text search with PostgreSQL FTS and relevance ranking |
/api/stats |
GET | Dashboard statistics (total articles, sources, jobs) |
/api/sources |
GET | List all active RSS sources |
| Endpoint | Method | Description | Auth Required |
|---|---|---|---|
/api/auth/login |
POST | User login (returns JWT in httpOnly cookie) | No |
/api/auth/logout |
POST | User logout (clears auth cookie) | Yes |
/api/auth/me |
GET | Get current authenticated user | Yes |
/api/auth/register |
POST | Register new user account | No |
| Endpoint | Method | Description | Auth Required |
|---|---|---|---|
/api/bookmarks |
GET | Get user's bookmarks | Yes |
/api/bookmarks |
POST | Add article to bookmarks | Yes |
/api/bookmarks |
DELETE | Remove bookmark | Yes |
/api/user/profile |
GET | Get user profile | Yes |
/api/user/profile |
PUT | Update user profile | Yes |
| Endpoint | Method | Description |
|---|---|---|
/api/admin/sources |
GET | List all RSS sources |
/api/admin/sources |
POST | Add new RSS source |
/api/admin/sources/[id] |
PUT | Update RSS source |
/api/admin/sources/[id] |
DELETE | Delete RSS source |
/api/admin/jobs |
GET | List feed job history |
/api/admin/users |
GET | List all users |
/api/admin/users |
POST | Create new user |
/api/admin/users/[id] |
PUT | Update user |
/api/admin/users/[id] |
DELETE | Delete user |
/api/admin/seed |
GET | Seed database (requires SEED_SECRET_KEY) |
| Endpoint | Method | Description | Auth Required |
|---|---|---|---|
/api/cron/fetch-feeds |
GET/POST | Trigger RSS feed fetch job | CRON_API_KEY or Vercel Cron secret |
All API endpoints return JSON with a consistent structure:
{
"success": true,
"data": { /* response data */ },
"error": "Error message (only if success: false)"
}Protected endpoints require a JWT token sent via:
- Cookie:
auth_token(httpOnly, secure in production) - Header:
Authorization: Bearer <token>
Token validity: 7 days
FeedCentral follows a Vercel-inspired design system focused on clarity, professionalism, and user respect.
- Minimal: No unnecessary elements or distractions
- Elegant: Subtle animations and generous spacing
- Professional: Clean, polished, and trustworthy
- Dark-first: Optimized for low-light reading environments
- Accessible: WCAG AA/AAA compliant with keyboard navigation
| Element | Specification |
|---|---|
| Primary Color | #7C5CFF (violet) |
| Background (dark) | #0a0a0a |
| Card Background | #121212 |
| Border (glass) | rgba(255, 255, 255, 0.08) |
| Typography | Geist Sans, Geist Mono |
| Border Radius | 8-12px (rounded corners) |
| Spacing | 8px scale (8, 12, 16, 24, 32) |
| Animations | 150-300ms with Vercel easing curve |
- Duration: 150-300ms maximum
- Easing:
cubic-bezier(0.16, 1, 0.3, 1)(Vercel curve) - Stagger: 30ms delay for list items
- Spring Animations: Stiffness 380-500, damping 30-40
- Accessibility: Respects
prefers-reduced-motion
- File Naming: PascalCase (e.g.,
FeedCard.tsx) - Client Components: Mark with
'use client'directive - Server Components: Default (no directive needed)
- Props Interfaces: Named
ComponentNameProps - Exports: Named exports preferred
- ESLint: Next.js configuration with strict rules
- TypeScript: Strict mode enabled
- Prettier: (Recommended to add)
npm run lint # Check for linting errors
npm run lint:fix # Auto-fix linting issues
npm run type-check # TypeScript compilation checknpm run db:studio # Open Prisma Studio for database inspection# Verify environment variables
npm run check-env
# Ensure .env file exists
cp .env.example .env# Check PostgreSQL is running
pg_isready
# Verify DATABASE_URL in .env
# Test connection with Prisma
npm run db:studio# Regenerate Prisma client
npm run db:generate
# Or reinstall dependencies (triggers postinstall)
npm install# Run seed script directly
npm run db:seed
# Or via API endpoint (if deployed)
curl "http://localhost:3000/api/admin/seed?key=YOUR_SEED_SECRET_KEY"# Clear Next.js cache
rm -rf .next
# Reinstall dependencies
rm -rf node_modules
npm install
# Rebuild
npm run build-
Local Development: Cron jobs don't run automatically. Trigger manually:
curl -X POST http://localhost:3000/api/cron/fetch-feeds \ -H "Authorization: Bearer YOUR_CRON_API_KEY" -
Vercel: Check cron configuration in
vercel.jsonand deployment logs
If you encounter issues:
- Check docs/DEVELOPER_GUIDE.md for common pitfalls
- Search GitHub Issues
- Open a new issue with:
- Environment details (OS, Node version, database)
- Error messages and logs
- Steps to reproduce
We welcome contributions from the community! Whether it's bug fixes, new features, documentation improvements, or design enhancements.
-
Fork the repository
git clone https://github.com/BENZOOgataga/feedcentral.git cd feedcentral -
Create a feature branch
git checkout -b feature/your-feature-name
-
Make your changes
- Follow the existing code style and conventions
- Add tests if applicable
- Update documentation as needed
-
Test your changes
npm run lint npm run type-check npm run build
-
Commit with clear messages
git commit -m "feat: add new feature description"Use conventional commits:
feat:New featurefix:Bug fixdocs:Documentation changesstyle:Code style changes (formatting)refactor:Code refactoringtest:Adding testschore:Maintenance tasks
-
Push and create a Pull Request
git push origin feature/your-feature-name
- Read the Developer Guide to understand the architecture
- Follow the Design Philosophy for UI/UX changes
- Ensure your code passes linting and type checks
- Write clear, descriptive commit messages
- Update relevant documentation
- Be respectful and constructive in discussions
- π¨ UI/UX improvements and accessibility enhancements
- π Bug fixes and error handling
- π Documentation and tutorials
- π Internationalization (i18n) support
- π§ͺ Test coverage improvements
- π Performance optimizations
- π± Mobile experience enhancements
This project is licensed under the MIT License - see the LICENSE file for details.
MIT License
Copyright (c) 2024 FeedCentral
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
FeedCentral is built on the shoulders of giants. Special thanks to:
- Next.js - The React framework for production
- Vercel - Deployment platform and design inspiration
- Tailwind CSS - Utility-first CSS framework
- shadcn/ui - Beautifully designed components
- Prisma - Next-generation ORM
- Framer Motion - Animation library
- Lucide - Beautiful icon set
- PostgreSQL - Powerful open-source database
- Vercel Dashboard - For the clean, professional design system
- Linear - For interaction patterns and micro-animations
- Raindrop.io - For bookmark organization concepts
Thanks to all contributors who have helped make FeedCentral better!
- Live Instance: feed.benzoogataga.com
- GitHub Repository: BENZOOgataga/feedcentral
- Issues & Bug Reports: GitHub Issues
- Discussions: GitHub Discussions
If you find FeedCentral useful, consider supporting its development:
- β Star the repository on GitHub
- π Support on Patreon
- π Report bugs and suggest features
- π Contribute code or documentation
- π Share FeedCentral with others
- Email: contact@benzoogataga.com
- Maintainer: @BENZOOgataga
FeedCentral is built with privacy and user respect at its core:
- β No tracking - We don't use analytics cookies or tracking scripts
- β No ads - Zero advertising, ever
- β No data selling - Your reading habits are yours alone
- β GDPR compliant - Operated from France with full GDPR compliance
- β Open source - Full transparency, audit the code yourself
- β Self-hostable - Run your own instance with complete control
Read our Privacy Policy and Terms of Service for details.
Built with β€οΈ for the open web
Take back control of your news feed.
Get Started β’ Documentation β’ Contribute