A modern, self-contained web application for tracking blog articles and managing read/unread status. Originally built as a UI for BlogWatcher, it now includes all functionality needed to work independently - no external CLI required.
- Modern Web Interface - Clean, responsive UI built with Go templates and HTMX
- Real-time Updates - HTMX-powered partial page updates for seamless interactions
- Article Management - Mark articles as read/unread with a single click
- Advanced Filtering - Filter by read/unread status, blog, date range, and search query
- Blog Management - View all tracked blogs with sync status
- Automatic Sync - Trigger scans to discover new articles from all blogs
- Thumbnail Support - Visual previews of articles with Open Graph image extraction
- Search - Full-text search across article titles, date posted, etc.
- Go 1.25.6 or later
Note: The BlogWatcher CLI is no longer required. This application is fully self-contained and will create its own database at ~/.blogwatcher/blogwatcher.db on first run. If you have an existing database from the BlogWatcher CLI, it will work seamlessly with it.
Download a pre-built binary for your platform from the Releases page:
# Example for Linux amd64
curl -LO https://github.com/esttorhe/blogwatcher-ui/releases/latest/download/blogwatcher-ui_<version>_linux_amd64.tar.gz
tar xzf blogwatcher-ui_<version>_linux_amd64.tar.gz
chmod +x blogwatcher-ui
mv blogwatcher-ui /usr/local/bin/# Uses GitHub release binaries — picks up new versions instantly
mise use github:esttorhe/blogwatcher-ui# Install v2.x (recommended - self-contained, no CLI required)
go install github.com/esttorhe/blogwatcher-ui/v2/cmd/server@latest
# Or install a specific version
go install github.com/esttorhe/blogwatcher-ui/v2/cmd/server@v2.0.0
# Run the installed binary
serverNote: If you encounter checksum verification errors (404 from sum.golang.org), the repository may be private. Set these environment variables:
export GOPRIVATE=github.com/esttorhe/blogwatcher-ui
export GONOPROXY=github.com/esttorhe/blogwatcher-ui
export GONOSUMDB=github.com/esttorhe/blogwatcher-uiUpgrading from v1.x? The module path changed to include
/v2. Use the new import path above. Your existing database will work without any migration.
The binary will be installed to $GOPATH/bin (or $GOBIN if set). Make sure this directory is in your PATH.
# Clone the repository
git clone https://github.com/esttorhe/blogwatcher-ui.git
cd blogwatcher-ui
# Build the server
go build ./cmd/server
# Run the server
./serverThe server will start on http://localhost:8080 by default.
# Run with hot reload (requires air or similar tool)
air
# Or run directly
go run ./cmd/server-
Start the Server
./server
-
Open in Browser Navigate to
http://localhost:8080 -
Add Blogs
- Go to Settings to add new blogs to track
- Enter the blog name and URL
- Feed URLs are auto-discovered from the blog's HTML
-
Sync Articles
- Click the "Sync" button to scan all tracked blogs for new articles
- The article list will automatically refresh with new content
-
Browse Articles
- View unread articles by default
- Filter by read/unread status using the filter buttons
- Filter by specific blog using the sidebar
- Search articles using the search bar
- Filter by date range using the date pickers
-
Manage Articles
- Click an article card to mark it as read
- Use "Mark All Read" to mark all unread articles as read
- Filter by blog to mark all read for a specific blog
This project was built using Claude Code with the get-shit-done framework, following spec-driven development principles.
blogwatcher-ui/
├── cmd/
│ └── server/
│ └── main.go # Server entry point
├── internal/
│ ├── model/ # Data models
│ ├── storage/ # Database layer (schema init, CRUD)
│ ├── service/ # Business logic layer
│ ├── server/ # HTTP server and handlers
│ ├── scanner/ # Blog scanning logic
│ ├── scraper/ # HTML scraping
│ ├── rss/ # RSS/Atom feed parsing
│ └── thumbnail/ # Thumbnail extraction
├── templates/ # Go HTML templates
│ ├── base.gohtml
│ ├── pages/
│ └── partials/
├── static/ # Static assets (CSS, JS)
└── go.mod
- Go 1.25.6 - Backend server
- HTMX - Progressive enhancement for dynamic interactions
- SQLite - Database (shared with BlogWatcher CLI)
- Go Templates - Server-side rendering
- goquery - HTML parsing and scraping
- gofeed - RSS/Atom feed parsing
GET /- Main index pageGET /articles- Article list (supports HTMX partial updates)GET /blogs- Blog list (supports HTMX partial updates)POST /articles/{id}/read- Mark article as readPOST /articles/{id}/unread- Mark article as unreadPOST /articles/mark-all-read- Mark all unread articles as readPOST /sync- Trigger blog scan and refresh article listPOST /api/sync- Trigger blog scan (JSON API for cronjob use)
filter- Filter by status:read,unread(default)blog- Filter by blog IDsearch- Full-text search querydate_from- Filter articles from date (YYYY-MM-DD)date_to- Filter articles to date (YYYY-MM-DD)
The application uses a SQLite database located at:
~/.blogwatcher/blogwatcher.db
The database and directory are created automatically on first run. If you have an existing database from the BlogWatcher CLI, the UI will use it seamlessly - the schema is fully compatible.
The database schema includes:
blogs- Tracked blogs (name, URL, feed URL, scrape selector)articles- Discovered articles (title, URL, dates, read status, thumbnails)articles_fts- Full-text search index for article titles
- Go 1.25.6+
go test ./...# Build binary
go build -o blogwatcher-ui ./cmd/server
# Build for specific platform
GOOS=linux GOARCH=amd64 go build -o blogwatcher-ui-linux ./cmd/serverContributions are welcome! Please feel free to submit a Pull Request.
MIT License - see LICENSE file for details
- Built with Claude Code
- Developed using get-shit-done framework
- UI for BlogWatcher by Hyaxia





