A modern, self-hosted RSS reader built with Go + React + SQLite. Take control of your news feed with a clean, fast, and distraction-free reading experience.
Secure JWT authentication with a clean, modern interface
- π° RSS/Atom Subscription - Subscribe and manage RSS/Atom feeds with batch import support
- π Smart Reading - Clean reading experience with full-text search
- π Read Later - Save articles for later reading
- π Folder Management - Organize feeds with folders
- β Bookmarking - Star important articles
- π§ Background Sync - Auto-update feeds with configurable intervals (default 15min)
- π€ OPML Import/Export - Standard OPML format support
- π¨ Modern UI - Beautiful warm-toned dark/light themes
- π± Mobile Responsive - Perfect for phones and tablets
- β¨οΈ Keyboard Shortcuts - Efficient keyboard navigation
- π Onboarding - Guided setup for first-time users
- π Feed Discovery - Built-in recommended feeds
Admin dashboard with system statistics and user management
- π₯ Multi-User Support - Multiple user accounts
- π‘οΈ Admin Panel - User management, system stats, account control
- π JWT Authentication - Secure token-based auth
- π Self-Hosted - Docker deployment, full data control
User settings with theme preferences and account management
# Clone repository
git clone <repo-url>
cd rssreader
# Start services
docker-compose up -d
# Access http://localhost:8080
# Default account: admin / admin# Build and deploy to remote server
./deploy.sh# Install Go dependencies
go mod download
# Run backend
go run ./cmd/servercd ui
# Install dependencies
pnpm install
# Development mode
pnpm dev
# Build production
pnpm build| Variable | Default | Description |
|---|---|---|
DATABASE_PATH |
./data/rssreader.db |
SQLite database path |
JWT_SECRET |
change-me-in-production |
JWT signing key (change in production) |
SERVER_PORT |
8080 |
Service port |
FETCH_INTERVAL |
15 |
Fetch interval (minutes) |
FETCH_CONCURRENCY |
5 |
Concurrent fetch limit |
POST /api/v1/login- User loginPOST /api/v1/register- User registrationGET /api/v1/me- Current user info
GET /api/v1/feeds- List all feedsPOST /api/v1/feeds- Add feedPOST /api/v1/feeds/batch- Batch add feedsGET /api/v1/feeds/:id- Feed detailsDELETE /api/v1/feeds/:id- Delete feedPOST /api/v1/feeds/:id/fetch- Manual refresh
GET /api/v1/articles- List articles (filter by: feed_id, folder_id, is_read, is_starred, is_read_later, q)GET /api/v1/articles/:id- Article detailsPATCH /api/v1/articles/:id- Update status (read/star/read_later)POST /api/v1/articles/mark-all-read- Mark all as read
GET /api/v1/folders- List foldersPOST /api/v1/folders- Create folderDELETE /api/v1/folders/:id- Delete folder
GET /api/v1/stats- User statistics
POST /api/v1/opml/import- Import OPMLGET /api/v1/opml/export- Export OPML
GET /api/v1/admin/stats- System statsGET /api/v1/admin/users- User listPOST /api/v1/admin/users- Create userGET /api/v1/admin/users/:id- User detailsPATCH /api/v1/admin/users/:id- Update userDELETE /api/v1/admin/users/:id- Delete userGET /api/v1/admin/users/:id/stats- User stats
- Go 1.21+ - High-performance backend
- Chi - Lightweight HTTP router
- SQLite - Embedded database, zero config
- gofeed - RSS/Atom parser
- JWT - Secure authentication
- bcrypt - Password hashing
- React 18 + TypeScript - Modern frontend
- Vite - Fast build tool
- TailwindCSS - Atomic CSS framework
- React Query (TanStack Query) - Server state management
- Zustand - Lightweight state management
- Lucide React - Beautiful icons
- date-fns - Date handling
- DOMPurify - XSS protection
rssreader/
βββ cmd/
β βββ server/ # Main entry point
βββ internal/
β βββ api/ # HTTP handlers and routes
β βββ auth/ # JWT authentication
β βββ config/ # Configuration
β βββ fetcher/ # RSS fetcher (background tasks)
β βββ models/ # Data models
β βββ store/ # Database layer
βββ migrations/ # Database migrations
βββ data/ # Data directory (DB, recommended feeds)
βββ ui/ # React frontend
β βββ src/
β β βββ api/ # API client and React Query hooks
β β βββ components/ # Reusable components
β β βββ layouts/ # Layout components
β β βββ pages/ # Page components
β β βββ stores/ # Zustand state management
β β βββ hooks/ # Custom hooks
β β βββ types/ # TypeScript types
β βββ ...
βββ deploy/ # Deployment artifacts
βββ Dockerfile # Docker image build
βββ docker-compose.yml # Docker Compose config
βββ Makefile # Build scripts
βββ deploy.sh # One-click deploy script
βββ README.md
- Docker and Docker Compose
- Port 8080 open (or custom port)
- Change
JWT_SECRETto a secure random string - Configure reverse proxy (Nginx/Caddy) with HTTPS
- Regularly backup
data/rssreader.db
Via admin panel /admin or API:
curl -X PATCH http://localhost:8080/api/v1/admin/users/1 \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"password": "newpassword"}'