ebcaa5d72a5884d9df9c47cb294e10078b56d79f
- Implement atomic state transitions: add EntryService.PatchEntry() with EntryDiff computation and EventEntryTransition event emission. - Add persistent SQLite task queue (JobEngine): add jobs table with crash recovery, exponential backoff retries, concurrency control, and idempotency key deduplication. - Decompose monolithic HTTP handlers: split handlers.go into domain handlers (auth, feeds, entries, jobs, settings, rules, sse). - Implement real-time Server-Sent Events (/api/events/stream) for multi-tab/device state synchronization. - Fix SQLite concurrency: apply busy_timeout(10000) and journal_mode(WAL) via DSN query parameters to resolve SQLITE_BUSY (5). - Fix AI settings & prompt loading: unmarshal JSON from ai_settings, apply configured prompt templates, and enforce strict enabled/API key validations. - Fix undo share state: remove omitempty from ShareUUID to serialize null for state resets. - Fix middle list counter: compute true unread/total stats from DB and clean switcher button labels. - Adapt mobile UI for iOS: add viewport-fit=cover in index.html and calibrate safe-area insets for the bottom navigation and article reader toolbar. - Add architectural documentation and worklog in docs/009_worklog.md.
RSSPipe 🚀
Modern, High-Performance RSS Information Gateway & Distraction-Free Reader
RSSPipe is a single-user, self-hosted RSS information gateway designed to replace traditional feeds readers with an elegant, ultra-fast, and distraction-free reading experience. Built with a robust Go backend and a modern React PWA interface.
✨ Key Features
- 🖥️ Reeder 4 Minimal 3-Pane View: Designed for desktop power users with collapsible navigation sidebar, dense article list, and distraction-free reading canvas.
- 📱 Xiaohongshu-Style Masonry Waterfall: Designed for mobile and media-rich browsing with adaptive masonry columns, category filter chips, and full-screen post reader.
- ⚡ High-Speed Crawler & Engine: Concurrent worker pool crawler in Go with per-feed polling intervals, custom timeouts, and HTTP conditional caching (ETag / Last-Modified 304).
- 🔒 Single-User Security & Auth: JWT-based session security and bcrypt hashing to secure access over the public internet.
- 📁 OPML 2.0 Import & Export: Effortless migration from Miniflux, Feedly, Inoreader, NetNewsWire, or Reeder.
- 🔗 Standalone Article Sharing: Instant public HTML snapshot sharing (
/share/{uuid}.html) for individual articles. - ⌨️ Keyboard Navigation: Complete single-key shortcut navigation (
j/knext/previous,mmark read,sstar,earchive,vview original,[sidebar toggle). - 💾 Local State & Reading Persistence: Restores exact view modes, filter selections, active feeds, and reading positions upon page refresh.
🛠️ Architecture & Tech Stack
┌─────────────────────────────────────────────────────────┐
│ React 18 PWA Frontend │
│ (Vite + TypeScript + Lucide + Modern CSS) │
└──────────────────────────┬──────────────────────────────┘
│ REST API + Static Asset Serving
┌──────────────────────────▼──────────────────────────────┐
│ Go 1.22 HTTP Server │
│ (Chi Router + JWT Auth) │
├──────────────────────────┬──────────────────────────────┤
│ Background Crawler │ SQLite Engine (WAL) │
│ (Worker Pool + Parser) │ (modernc.org/sqlite Driver) │
└──────────────────────────┴──────────────────────────────┘
- Backend: Go 1.22+,
go-chi/chi,gofeedparser,golang-jwt/jwt. - Database: Embedded SQLite with WAL mode (
modernc.org/sqlitepure Go driver, no CGO required). - Frontend: React 18, TypeScript, Vite, CSS custom properties.
🚀 Quickstart
Option 1: Run with Docker Compose
# Clone the repository
git clone https://git.pengzhan.dev/haopengzhan/rsspipe.git
cd rsspipe
# Start RSSPipe
docker compose up -d
Visit http://localhost:8080.
Default credentials:
- Username:
admin - Password:
admin123456(configurable via environment variables)
Option 2: Local Development Setup
Prerequisites
- Go 1.22+
- Node.js 18+ & npm
# Clone the repository
git clone https://git.pengzhan.dev/haopengzhan/rsspipe.git
cd rsspipe
# Build and start server using Makefile
make dev
Or build separately:
make build # Compiles frontend bundle + backend binary into bin/rsspipe
./bin/rsspipe # Runs production binary
The server binds to http://localhost:8080 and serves both the API endpoints and static frontend assets.
⚙️ Configuration & Environment Variables
| Variable | Default | Description |
|---|---|---|
PORT |
8080 |
Server HTTP port |
DB_PATH |
./data/rsspipe.db |
Path to SQLite database file |
JWT_SECRET |
(auto-generated) | 32-byte secret key for signing JWT tokens |
ADMIN_USERNAME |
admin |
Initial default administrator username |
ADMIN_PASSWORD |
admin123456 |
Initial default administrator password |
CRAWLER_WORKERS |
10 |
Number of concurrent fetch worker threads |
CRAWLER_INTERVAL |
15 |
Default background crawler interval (minutes) |
⌨️ Keyboard Shortcuts
| Shortcut | Action |
|---|---|
j / k |
Navigate to Next / Previous article |
m |
Toggle Read / Unread status |
s |
Toggle Starred status |
e |
Mark as read and advance to next |
v |
Open original article URL in new tab |
[ |
Toggle left navigation sidebar |
r |
Trigger immediate refresh of feeds |
a |
Open "Add Subscription" modal |
1 |
Switch to Desktop 3-Split View |
2 |
Switch to Xiaohongshu Waterfall View |
3 |
Switch to Settings & Management View |
Shift + A |
Mark all items in active view as read |
? |
Open keyboard shortcuts cheatsheet |
Esc |
Close any active modal dialog |
🧪 Testing & Quality Automation
make check # Run all quality checks (gofmt, go vet, tests, tsc, gitleaks)
make test # Run backend Go unit tests
make lint # Check formatting and run go vet
make format # Auto-format all Go files
📄 License
MIT License. Free for personal and commercial self-hosted use.
Languages
TypeScript
47%
Go
42.7%
CSS
9%
Makefile
0.4%
Shell
0.3%
Other
0.5%