gRoSS is a lightweight, self-hosted RSS feed reader built in Go. No Electron. No Node. No nonsense. Just a single binary, a SQLite database, and your feeds.
- Add any RSS or Atom feed — via URL
- Auto-polling — feeds refresh every 15 minutes in the background
- Filters — focus on what you want
- Zero dependencies to run — single binary + SQLite file
- Server-rendered HTML — works in any browser, no JS framework
- Go 1.21+
- GCC (required for SQLite via
go-sqlite3)
# Clone the repo
git clone https://github.com/tmarcum6/gross.git
cd gross
# Install dependencies
go mod tidy
# Run
go run .Then open http://localhost:8080 in your browser.
go-rss/
├── main.go # Entry point, router, handlers
├── go.mod
├── rss.db # Auto-created SQLite database
├── db/
│ ├── db.go # DB init & table creation
│ ├── feeds.go # Feed queries
│ └── articles.go # Article queries
├── models/
│ └── feed.go # Feed & Article types
├── poller/
│ └── poller.go # Background feed polling
└── templates/
├── templates.go # Template loader & renderer
├── layout.html # Base layout with sidebar
├── index.html # Homepage / all articles
└── feed.html # Single feed view
| Method | Path | Description |
|---|---|---|
GET |
/ |
Homepage — all articles |
GET |
/?unread=true |
Unread articles only |
POST |
/feeds |
Add a new feed |
GET |
/feeds/{id} |
View articles for a feed |
POST |
/articles/{id}/read |
Mark an article as read |
# Run all tests
go test ./...
# Run with verbose output
go test ./... -v
# Check coverage
go test ./... -coverTests use SQLite's :memory: mode — no files created, no cleanup needed.
| Layer | Tech |
|---|---|
| Language | Go |
| Router | chi |
| RSS Parsing | gofeed |
| Database | SQLite via go-sqlite3 |
| Templates | html/template |
- OPML import / export
- Feed categories / folders
- Full-text search
- Article preview pane
- Dark / light theme toggle
- Docker support
- Tailwind CSS
- RSS Lookup
- Tracking for Read and Saved
- Hot-Reload
- Social
- Custom feeds